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的基本使用方法是关键。