首页 > 使用gdbserver远程调试

使用gdbserver远程调试

使用gdbserver远程调试

 

1.默认crosstool交叉编译器没有自带gdbserver,需要自行编译

到GNU官方FTP下载,目前最新版的是gdb-6.7.1

下载地址:http://ftp.gnu.org/gnu/gdb/

注:若已有gdbserver,可以直接跳到步骤4

 

2.编译gdbserver

编译GDB源码时只需要编译出gdbserver就可以了,交叉编译器自带arm-linux-gdb(client端)可以使用。

gdb-6.7.1

# cd gdb-6.7.1/gdb/gdbserver/

#./configure --host=arm-linux --prefix=/work/install/gdbserver

#make

#make install

这时会在/work/install/gdbserver目录下生成bin/gdbserver,将其拷贝到nfs文件系统

#cd /work/install/gdbserver

#cp bin/gdbserver /work/nfs/rootfs/bin

 

3.库问题

这里需要注意的是运行gdbserver还需要libthread_db库,若你自己做的文件系统内没有这个库的话需要从交叉编译器内拷一个过去。

# gdbserver -h (target)

gdbserver: error while loading shared libraries: libthread_db.so.1: cannot open shared object file: No such file or directory

# cp -avf lib/libthread_db* /work/nfs/rootfs_bluetooth_omap/lib/

`/lib/libthread_db-1.0.so' -> `/work/nfs/rootfs/lib/libthread_db-1.0.so'

`/lib/libthread_db.so.1' -> `/work/nfs/rootfs/lib/libthread_db.so.1'

注:若不知道缺少什么库可以根据运行时错误提示拷贝或者用先用strace跟踪一下:

#strace -f -F -o strace.log gdbserver -h

#vi strace.log 

发现如下字段:

872   writev(2, [{"gdbserver", 9}, {": ", 2}, {"error while loading shared libra"..., 36}, {": ", 2}, {"libthread_db.so.1", 17}, {": ", 2}, {"cannot open shared object file", 30}, {": ", 2}, {"No such file or directory", 25}, {" ", 1}], 10) = 126

872   exit_group(127)                   = ?

得知缺少libthread_db.so.1库(红色部分标出)。

 

4.调试过程

1)Target端建立远程调试服务

# gdbserver 192.168.167.170:1234 obexftp (target)

Process obexftp created; pid = 858

Listening on port 1234

 

2)Host端GDB加载要调试的程序

这里要调试的程序得是交叉编译过的,并且加了-g参数。不过大部分编译程序默认就是加了-g参数的,这点可以从编译时的log看出。

# arm-linux-gdb obexftp

GNU gdb 6.6.50.20070301 (MontaVista 6.6.50-2.0.1.0702865 2007-03-26)

Copyright (C) 2007 Free Software Foundation, Inc.

GDB is free software, covered by the GNU General Public License, and you are

welcome to change it and/or distribute copies of it under certain conditions.

Type "show copying" to see the conditions.

There is absolutely no warranty for GDB.  Type "show warranty" for details.

This GDB was configured as "--host=i686-pc-linux-gnu --target=armv5tl-montavista-linux-gnueabi"...

 

3)连接到目标板调试服务

(gdb) target remote 192.168.167.15:1234

Remote debugging using 192.168.167.15:1234

Error while reading shared library symbols:

Dwarf Error: Can't read DWARF data from '/opt/montavista/pro/devkit/arm/v5t_le/target/usr/lib/debug/lib/ld-2.5.90.so.debug'

0x400007a0 in _start () from /opt/montavista/pro/devkit/arm/v5t_le/target/lib/ld-linux.so.3

注:上面两行错误信息暂时不用管,原因还不清楚,但是暂时发现不影响使用。

连接成功后ARM板上的信息应该是这样的:

# ./gdbserver 192.168.0.29:1234 arm0702_8.out

Process arm0702_8.out created; pid = 228

Remote debugging from host 192.168.0.29  <----多出这一行

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

调试过程如下:

(gdb) b main

Breakpoint 1 at 0x9870: file obexftp.c, line 376.

(gdb) info b

Num Type           Disp Enb Address    What

1   breakpoint     keep y   0x00009870 in main at obexftp.c:376

(gdb) c

Continuing.

Error while mapping shared library sections:

/work/install/bluetooth//lib/libobexftp.so.0: No such file or directory.

Error while mapping shared library sections:

/work/install/bluetooth//lib/libc.so.6: No such file or directory.

Breakpoint 1, main (argc=1, argv=0xbed0dec4) at obexftp.c:384

384             if (strstr(argv[0], "ls") != NULL)      most_recent_cmd = 'l';

(gdb)

若产生这个错误主要是由于该调试的应用程序使用到了额外的库,而这个库在gdb默认的搜索路径内没有

(相对与远程调试,gdb默认搜索的路径即为交叉编译器的库路径,下面我会介绍到)

因此,这里我们需要修改一下gdb默认的共享库搜索路径。

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

(gdb) show solib-absolute-prefix

The current system root is "/opt/montavista/pro/devkit/arm/v5t_le/target".

上面这个路径即GDB默认的绝对搜索路径,即交叉编译器库路径

(gdb) show solib-search-path

The search path for loading non-absolute shared library symbol files is .

(gdb) set solib-search-path /work/install/bluetooth/lib

这个路径为若在solib-absolute-prefix指定的路径内没有搜索到库,则再继续尝试从该路径进行搜索。

这点倒有点类似于系统默认库搜索路径与LD_LIBRARY_PATH的关系。

详细参考GDB手册中相关部分:

http://wiki.chinaunix.net/index.php/GDB_Manual_15_1

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

(gdb) set solib-search-path /work/install/bluetooth/lib/

(gdb) c

Continuing.

Error while reading shared library symbols:

Dwarf Error: Can't read DWARF data from '/opt/montavista/pro/devkit/arm/v5t_le/target/usr/lib/debug/lib/ld-2.5.90.so.debug'

Breakpoint 1, main (argc=1, argv=0xbe896eb4) at obexftp.c:384

384             if (strstr(argv[0], "ls") != NULL)      most_recent_cmd = 'l';

(gdb) l

379             char *output_file = NULL;

380             char *move_src = NULL;

381             /* char *inbox; */

382

383             /* preset mode of operation depending on our name */

384             if (strstr(argv[0], "ls") != NULL)      most_recent_cmd = 'l';

385             if (strstr(argv[0], "get") != NULL)     most_recent_cmd = 'g';

386             if (strstr(argv[0], "put") != NULL)     most_recent_cmd = 'p';

387             if (strstr(argv[0], "rm") != NULL)      most_recent_cmd = 'k';

388

(gdb)

运行成功

 

 

注:使用GDB调试时查看代码不是很方便。CLWEN使用VIM作为GDB前端界面,结合gdb的远程调试功能,动态的将程序当前运行的代码显示在VIM上,查看起来十分方便。其远程调试方法和GDB+GDB Server一样,但是多了一个GUI界面(VIM)。

转载于:https://www.cnblogs.com/li-hao/p/3171267.html

更多相关:

  • 在debug模式下,使用GDB进行调试,可以使用的命令汇总如下: (gdb) p *(*pHead)->next   这里声明语句ListNode** pHead,表示查看*pHead执行链表节点的next域的指针  (gdb) bt full 相比bt能显示更详细的局部变量信息 (gdb) b   hookfactory.cp...

  • OpenCV 一、计算机 中的配置: 在 计算机 -> 属性 -> 高级系统属性 -> 高级 -> 环境变量 -> 系统变量 -> Path 中添加: D:Program Filescpp libopencvuildx64vc15in 二、Visual Studio 中的配置: 1.在 VC++目录 ->...

  • 1.首先要知道什么是ORACLE的客户端: Oracle Instant client 是oracle提供的简便客户端, 支持多种平台. 可从oracle网站下载, 下载地址为http://www.oracle.com/technology/tech/oci/instantclient/index.html 包括如下内容: Inst...

  • 什么是dcevm        dcevm(DynamicCode Evolution Virtual Machine)是java hostspot的补丁(严格上来说是修改),允许(并非无限制)在运行环境下修改加载的类文件.当前虚拟机只允许修改方法体(method bodies),decvm,可以增加 删除类属性、方法,甚至改变一个类...