首页 > 代码库 > GDB远程调试(一)之DM8168下gdb远程调试环境的搭建

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



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,也没有显示代码