嵌入式调试中gdb+gdbserver 调试环境搭建

1.  gdb + gdbserver交叉编译

   下载GDB源码: 

  http://ftp.gnu.org/gnu/gdb/

这里选择gdb-7.9.1.tar.gz

tar -zxvf gdb-7.9.1.tar.gz 

gdb 安装:

cd gdb-7.9.1

./configure --target=arm-ambarella-linux-uclibcgnueabihf --prefix=/usr/local/arm-amba-gdb -v

--target配置gdb的目标平台,--prefix配置安装路径

make

make install

将bin目录下生成的可执行文件拷贝至交叉编译器的bin目录下

gdbserver安装

cd gdb-7.9.1/gdb/gdbserver

./configure --host=arm-ambarella-linux-uclibcgnueabihf --prefix=/usr/local/gdbserver

make 

make install

bin目录下生成可执行文件gdbserver ,用于板端运行

 

2.板端建立远程调试环境

./gdbserver 192.168.1.86:1234 ipcam

192.168.1.86为PC端IP地址

3.HOST端GDB加载要调试的应用程序

arm-ambarella-linux-uclibcgnueabihf-gdb ipcam

4.连接到目标板调试服务

(gdb) target remote 192.168.1.87:1234

192.168.1.87为板端IP地址

 

成功连接arm板后,板端打印信息为:

 ./gdbserver 192.168.1.86:1234 ipcam
Process ipcam created; pid = 274
Listening on port 1234
Remote debugging from host 192.168.1.86

 

上面这行表示宿主机和开发板连接成功。现在我们就可以在Host端像调试本地程序一样调试ARM板上程序。不过,需要注意的是这里执行程序要用“c”,不能用“r”。因为程序已经在Target Board上面由gdbserver启动了。

 

Remote 'g' packet reply is too long问题解决:

Remote 'g' packet reply is too long: 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060fdff7e00000000542eff76100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
0x76ff2e54 in ?? ()

修改gdb/remote.c文件,定位到:

static void process_g_packet (struct regcache *regcache)函数,6113行,屏蔽对buf_len的判断。

嵌入式调试中gdb+gdbserver 调试环境搭建_第1张图片

 

(gdb) c

Continuing.
warning: Could not load shared library symbols for 15 libraries, e.g. /usr/lib/libfreetype.so.6.
Use the "info sharedlibrary" command to see the complete listing.
Do you need "set solib-search-path" or "set sysroot"?

Program received signal SIGSEGV, Segmentation fault.
0x76ff5d62 in ?? () 

若产生这个错误主要是由于该调试的应用程序使用到了额外的库,而这个库在gdb默认的搜索路径内没有
(相对与远程调试,gdb默认搜索的路径即为交叉编译器的库路径)
因此,这里我们需要修改一下gdb默认的共享库搜索路径。

 修改的办法是设置GDB的环境变量:

solib-absolute-prefix设置的是被搜索文件路径的前缀,一般设置为交叉编译工具链的库路径前缀,即不包括lib目录,lib目录的父目录,solib-search-path设置的是被搜索库文件的路径。solib-search-path可以有多个路径,中间按用:隔开, solib-absolute-prefix的值只能有一个。若在solib-absolute-prefix指定的路径内没有搜索到库,则再继续尝试从solib-search-path指定的路径进行搜索。 

设置库搜索路径:

根据提示依次找到相应库的路径,并设置,以下是我的最终结果:

e.g: 

(gdb)set solib-search-path /usr/local/arm-amba-linux-uclibcgnueabihf-2014.11-gcc4.9/arm-ambarella-linux-uclibcgnueabihf/sysroot/usr/lib:/home/yym/work/S2L_2_0:/usr/local/arm-amba-linux-uclibcgnueabihf-2014.11-gcc4.9/arm-ambarella-linux-uclibcgnueabihf/sysroot/lib

 

设置好 solib-search-path后再运行程序

(gdb) c
Continuing.

Program terminated with signal SIGSEGV, Segmentation fault.
The program no longer exists.

如果出现上述情况,需再次重复步骤2,4 再运行

 

 

 

 

 

你可能感兴趣的:(嵌入式linux)