gdb 使用

1、GDB多线程调试的基本命令:

info threads:显示当前可调试的所有线程,每个线程会有一个GDB为其分配的ID,后面操作线程的时候会用到这个ID。 前面有*的是当前调试的线程。

thread ID:切换当前调试的线程为指定ID的线程。

break thread_test.c:123 thread all: 在所有线程中相应的行上设置断点

thread apply ID1 ID2 command: 让一个或者多个线程执行GDB命令command。 

thread apply all command: 让所有被调试线程执行GDB命令command。

set scheduler-locking off|on|step :在使用step或者continue命令调试当前被调试线程的时候,其他线程也是同时执行的。off 不锁定任何线程,也就是所有线程都执行,这是默认值。 on 只有当前被调试程序会执行。 step 在单步的时候,除了next过一个函数的情况以外,只有当前线程会执行。

(minicom下)
#cd /tmp
#./gdbserver 192.168.2.100:2345 hello
192.168.2.100为宿主机IP,在目标系统的2345端口开启了一个调试进程,hello为要调试的程序。
出现提示:
Process /tmp/hello created: pid="80"
Listening on port 2345
(另一个终端下)
#cd /
#export PATH=$PATH:/usr/local/arm-gdb/bin
#arm-linux-gdb hello
(gdb) target remote 192.168.2.223:2345
(192.168.2.223为开发板IP)
出现提示:
Remote debugging using 192.168.2.223:2345
[New thread 80]
[Switching to thread 80]
0x40002a90 in ??()
同时在minicom下提示:
Remote debugging from host 192.168.2.100
(gdb)
连接成功,这时候就可以输入各种gdb命令如list、run、next、step、break等进行程序调试了。

远程调试环境由宿主机gdb和目标机调试stub共同构成,两者通过串口或TCP连接。使用GDB标准程串行协议协同工作,实现对目标机上的系统内核和上层应用的监控和调试功能。调试stub是嵌入式系统中的一段代码,作为宿主机GDB和目标机调试程序间的一个媒介而存在。

2、源程序编译:

download  from  http://cygwin.mirrors.pair.com/gdb/old-releases/

$ tar jxf gdb-5.2.1.tar.bz2

$ cd gdb-5.2.1

$ mkdir obj

$ cd obj

../configure --target=armv4l-unknown-linux /

        --enable-shared --prefix=/tmp/g /

        --without-x --disable-gdbtk --disable-tui /

        --without-included-regex --without-included-gettext

$ make

$ make install

$ mkdir gdb/gdbserver 

$ cd gdb/gdbserver

$ chmod +x ../../../gdb/gdbserver/configure

$ CC=/opt/host/armv4l/bin/armv4l-unknown-linux-gcc /

        ../../../gdb/gdbserver/configure armv4l-unknown-linux /

        --without-included-regex --without-included-gettext

$ make

$ cp -vf gdbreplay gdbserver /tmp/g/bin

3、多线程调试:

如果要调试的程序有线程的话,则需手动运行程序后,用下面的命令调试相应的线程

gdbserver 59.69.74.87:2345 --attach 21119

其中 21119是线程进程号

4、动态库调试:

gdb) b main //在程序入口处设个断点

Breakpoint 1 at 0xb2e8: file main.cpp, line 24.

(gdb) c

Continuing.

(gdb) directory ../datamanage   //加入动态库源码目录,不然gdb无法找到源文件

Source directories searched: /home/yifei/Src/taskmanage/../datamanage:/home/yifei/WFET20d

(gdb) sharedlibrary     //将共享库加入

Reading symbols from /home/et1000/lib/libbase.so...done.

(gdb) br TaskDb.cpp:35  //在动态库源程序中设断点

Breakpoint 2 at 0x400b60c0: file TaskDb.cpp, line 35.

 注意:1、主机上动态库的路径必须与目标机的路径一样

              2、主机上动态库的目录需有执行权

5、gdb 的常用命令:

  bt 显示所有的调用栈帧。该命令可用来显示函数的调用顺序。

  clear 删除设置在特定源文件、特定行上的断点。其用法为clear FILENAME:NUM

  continue 继续执行正在调试的程序。该命令用在程序由于处理信号或断点而 导致停止运行时。

  display EXPR 每次程序停止后显示表达式的值。表达式由程序定义的变量组成。

  file FILE 装载指定的可执行文件进行调试。

  help NAME 显示指定命令的帮助信息。

  info break 显示当前断点清单,包括到达断点处的次数等。

  info files 显示被调试文件的详细信息。

  info func 显示所有的函数名称。

  info local 显示当函数中的局部变量信息。

  info prog 显示被调试程序的执行状态。

  info var 显示所有的全局和静态变量名称。

  kill 终止正被调试的程序。

  make 在不退出 gdb 的情况下运行 make 工具。

     print EXPR 显示表达式 EXPR 的值。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值