您的位置:首页 > 其它

GDB远程调试(一)之DM8168下gdb远程调试环境的搭建

2014-11-20 00:21 302 查看
http://www.th7.cn/Program/c/201405/210839.shtml

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与目标板就能通信,调试了,如下图:

完。

附录:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: