GDB在ARM板中的应用

GDB的下载:

http://www.gnu.org/software/gdb/

下载gdb-7.4.tar.bz2

1.解压: tar xjf gdb-7.4.tar.bz2

2.编译gdb和gdbserver

2.1   编译gdb:

   cd gdb-7.4/

  .configure -- target=arm-linux  //配置

   make //编译

   make install //安装,注意如果直接运行make install的话,直接撞到pc机的usr/bin中去了。我不想这么直接安装,想看看安装时生成什么东西?

   vi makefile,然后搜索prefix,这prefix就是指代安装的路径。因此我可以自定义我的安装路径

   mkdir tmp

   make install prefix = $PWD / tmp

   此时可以去tmp目录下,看一下都生成了什么东西。你会看到有bin  include   lib   share目录。进入bin目录,你会看到arm-linux-gdb的程序。

2.2  编译gdbserver

  cd gdb / gdbserver

  .configure  --host = arm-linux

   make

   编译的过程中会出现错误:PTRACE GETSIGINFO没有定义。-I表示头文件在哪里。在-I指定的头文件中没有所需要的头文件,怎么板呢?

  注意:头文件除了在-I指定的目录里找,还去交叉编译工具链里面找,交叉编译工具链在哪呢?

  echo $PATH

  cd /tools/gcc-3.4.5-glibc-2.3.6/bin

  grep "PTRACE_GETSIGINFO"  * -nR,搜索后发现,该宏在arm-linux/inluce/linux / ptrace.h中已经定义了,那为什么提示没有定义呢?

  打开出错的文件:linux-arm-low.c,发现它包含的是include <sys/ptrace.h>,因此我们修改为 #include <linux / ptrace.h>

  此时再进行编译,就不会有任何问题了。最终生成gdbserver

3.  在开发板中使用GDB的原理

  

 在PC机里编译APP程序,然后在PC机里进行调试,此时我们使用的工具是gdb

 我们把编译好的APP文件拷贝到ARM板上,因为这个程序是运行在ARM板上。

 我们在PC机里如何去调试在ARM板中运行的程序呢?带着这个问题,一步步的向下走。

在PC机上,gdb发出的命令给谁呢?比如说,设一个断点,它会不会直接给ARM板上的APP程序。答案显然不会的,此时gdb_server就要出场了,这个gdb_server就是APP的父进程。在PC机上运行的gdb发出命令给gdb server,比如说想让APP这个程序停止,此时就发送命令给gdb server,gdb server收到命令后,就给子进程(APP程序)发一个信号,让该程序停止下来。

举个例子:gdb去读APP中的变量a

gdb会从带有调试信息的文件中确定a变量的地址,然后发送命令给gdb server,gdb server再去访问APP的内存空间。

编译要调试的应用程序,编译时加上-g选项: arm-linux-gcc -g -o test_debug test_debug.c,把编译出来的test_debug拷贝到开发板上。

调试:

(1)在ARM板上

gdbserver  192.168.1.17 : 端口   ./test_debug

注意:此IP地址为ARM的ip地址,从这里可以看出,在使用之前,需要确保arm板和PC机必须ping的通。

端口可以随便写,在这里取2345

(2)在PC机上

arm-linux-gdb  ./test_debug

(gdb) target remote 192.168.1.17 : 2345 (建立PC和开发板的连接)

(gdb) l

你会看到接下来的使用方式和前几篇博客中介绍的gdb的使用方法完全相同了

法2:让程序在开发板上直接运行,当它产生错误时,令它产生core dump文件,将此文件拷贝到pc机上,在PC机上使用gdb,根据core dump文件找到程序发生错误的地方。

(1)ulimit -c unlimited

(2)在开发板上执行应用程序,程序出错时会在当前目录下生成名为core的文件

./test_debug    (假设这个应用程序有问题)

执行后,会出现Segmentation fault (core dump)

注意这是在开发板上得到的core dump文件,需要将它拷到PC机上。

(3)在PC机上执行:

arm-linux-gdb  ./test_dubug  ./core

在这里你会看到又进入了(gdb)调试的界面了。

总结:

在嵌入式开发中,我们肯定会去调试在ARM板中运行的程序,本篇博客就简单的介绍了如何调试在开发板上运行的程序。在搭建好环境后,还是会回到gdb调试程序的界面,这个界面就和之前的gdb使用方法完全一样了,因此想要高效的调试嵌入式程序,熟练掌握gdb的基本使用方法是关键。

  

   

  

猜你喜欢

转载自www.cnblogs.com/-glb/p/12563700.html