1、前言
gdb是较为流行和通用的linux环境调试工具,掌握它对于嵌入式开发工作来说非常必要,能够提高工作效率,快速发现和解决问题。最近有兴趣研究了下gdb使用,特总结如下以备以后查阅。
2、下载最新的gdb
下载地址:http://ftp.gnu.org/gnu/gdb/,选择目前最新的版本下载。我选择了gdb-7.7.tar.gz版本
3、编译gdb和gdbserver
(1)解压到你的工作目录:
zhaochenhui@server-rd3:~$ tar -xvf gdb-7.7.tar.gz
(2)添加环境变量:
zhaochenhui@server-rd3:~$ vi .bashrc
添加以下两条,
#gdb安装位置
export PATH="$PATH:/home/zhaochenhui/gdb-7.7/bin"
#DM81xx交叉编译集安装位置
exportPATH="$PATH:/opt/DVRRDK_04.00.00.03/ti_tools/cgt_a8/arago/linux-devkit/bin"
然后保存退出。
~$source.bashrc #立即生效
(3)修改代码
修改./gdb-7.7/gdb/remote.c文件如下代码,注释掉:
if (buf_len > 2 * rsa->sizeof_g_packet)
error (_("Remote ‘g‘ packet reply istoo long: %s"), rs->buf);
替换为:
if (buf_len > 2 *rsa->sizeof_g_packet) {
rsa->sizeof_g_packet =buf_len ;
for (i = 0; i <gdbarch_num_regs (gdbarch); i++)
{
if (rsa->regs[i].pnum ==-1)
continue;
if (rsa->regs[i].offset>= rsa->sizeof_g_packet)
rsa->regs[i].in_g_packet =0;
else
rsa->regs[i].in_g_packet =1;
}
}
否则会有附录所示的错误产生。
(4)编译arm-arago-linux-gnueabi-gdb(服务器端)
gdb-7.7使用了autoconf/automake。因此,通过设置configure脚本的--target,--host,--prefix参数就可以方便的移植到别的平台。--target指定了需要调试的目标机环境,一般设置为交叉编译器的前缀,比如--target=arm-linux,--target=mips-linux,--target=armv5-linux-uclibc,--target的缺省值为i386-linux,也就是i386PC机--host指定编译后的文件的运行环境,取值可以是i386-linux或者交叉编译器的前缀,缺省为i386-linux
--prefix为指定要安装的目录。
在gdb-7.7目录下输入:
zhaochenhui@server-rd3:~/gdb-7.7$./configure --target=arm-arago-linux-gnueabi --prefix=/home/zhaochenhui/gdb-7.7/bin
配置成功后会显示创建了Makefile
接下来
zhaochenhui@server-rd3:~/gdb-7.7$make
zhaochenhui@server-rd3:~/gdb-7.7$make install
(5)编译arm-arago-linux-gnueabi-gdbserver(目标板端)
zhaochenhui@server-rd3:~/gdb-7.7$cd gdb/gdbserver/
zhaochenhui@server-rd3:~/gdb-7.7/gdb/gdbserver$./configure--target=arm-arago-linux-gnueabi --prefix=/home/zhaochenhui/gdb-7.7/bin--host=arm-linux
编译的时候要指定交叉编译器,因为arm-arago-linux-gnueabi-gdbserver是运行在目标板的。
zhaochenhui@server-rd3:~/gdb-7.7/gdb/gdbserver$makeCC=/opt/DVRRDK_04.00.00.03/ti_tools/cgt_a8/arago/linux-devkit/bin/arm-arago-linux-gnueabi-gcc
编译结果有错误,如图所示:
linux-arm-low.c没有找到sys/reg.h文件,这可能是Makefile没有正确包含sys/reg.h的路径,不同的操作系统有一定的区别。那么开始找本系统的sys/reg.h
根据一定的经验,最有可能在/usr目录下,那么先从这找起,输入:
zhaochenhui@server-rd3:/usr$find -iname "reg.h"
果然./include/x86_64-linux-gnu/sys/reg.h最像,直接修改代码,或者在Makefile的include中添加,查找include的方法,输入:
zhaochenhui@server-rd3:~/gdb-7.7/gdb/gdbserver$cat Makefile | grep -i "include"
看到INCLUDE_CFLAGS,可以在这后面添加-Ibalabala~~~等等。
在linux-arm-low.c 129行修改:
改为:
保存退出。
zhaochenhui@server-rd3:~/gdb-7.7/gdb/gdbserver$make
zhaochenhui@server-rd3:~/gdb-7.7/gdb/gdbserver$make install
编译后的结果如下:
至于arm-arago-linux-gnueabi-run是做什么用的,目前我也不知道。但是咱们需要的arm-arago-linux-gnueabi-gdb,arm-arago-linux-gnueabi-gdbserver已经编译完成。
4、测试是否可用
(1)目标板端
将arm-arago-linux-gnueabi-gdbserver拷贝到目标板端的nfs调试目录,随便找个测试程序,输入:
./arm-arago-linux-gnueabi-gdbserver 192.165.54.12:30000 edma_test_drv
其中192.165.54.12是你的nfs调试服务器IP,30000是调试的监听端口,gdbserver与目标板通过此30000端口保持通信,edma_test_drv是调试应用程序。如下图所示:
(2)服务器端
在同样的nfs调试目录输入:
zhaochenhui@server-rd3:~/ti8168_mnt/projxxxx/app_driver$./arm-arago-linux-gnueabi-gdb edma_test_drv
gdb启动如图所示:
然后输入:target remote 192.165.54.170:30000
其中192.165.54.170是目标板IP,端口也是30000,这样gdbserver与目标板就能通信,调试了,如下图:
完。
附录:
Remote ‘g‘ packet reply is too long错误,输入l,也没有显示代码