GDB命令

1.display var

当程序运行停止时(next,step,遇到断点停止,watch过的值变化导致程序停止等)会显示之前display过的值(当然这个值是在当前上下文可见)

2.watch var

    watch过的值变化时会导致程序停止,并显示变量值。监视点的设定不依赖于断点的位置,但是与变量的作用域有关,也就是说,要设置监视点必须在程序运行时才可设置。在不确定发生问题的地方时,通过使用监视点的条件表达式,可以非常方便地找出问题代码:

watch i > 999

 

 

 

一旦i > 999,程序就会被中断,GDB指出改变条件的代码。

3.frame num

num为栈帧的序号,切换到相应的栈帧。切换后就可以查看那个栈帧的变量,用命令(info locals)。注意(info locals)只会显示局部变量但不会显示函数传进来的参数,可以用(p [var])来看参数。

4.在共享库里打断点调试

ldd program (查看program用到的共享库的路径)

readelf -S [lib] | grep debug (查看共享库是否支持debug)

gdb --args program [参数] 

进入gdb后:

b main

r   (运行后会在main函数处停止,这一步很重要,这一步后会加载共享库)

b [symbol] (在共享库的函数symbol处设置断点,如何查看共享库的函数对应的符号参考后面的内容)

c (程序会在断点处停下)

5.C++中如何查找函数对应的symbol

    nm -s [elf_file] | grep [fun_name]

6.condition

condition <break_list> (condition)
例如:
cond 3 i == 3
将会在断点3上附加条件(i == 3)

7.break [break-args] if (condition)

break main if argc > 1

break 180 if (string == NULL && i < 0)

break test.c:34 if (x & y) == 1

break myfunc if i % (j + 3) != 0

break 44 if strlen(mystring) == 0

其中if中用到的变量的作用域在断点处可见就行,而不用在设置断点处可见

8.finish

执行完当前函数后停止

9.commands

设置一个断点并且在上面中断后,我们必然会查询一些变量或者做一些其他动作。
如果这些动作可以一气呵成,岂不妙哉!使用命令列表(commands)就能实现这个功能。

步骤如下:

commands break_list
例如:

(gdb) commands 1
Type commands for when breakpoint 1 is hit, one per line.
End with a line saying just "end".
>silent 
>printf "n = %d \n", n
>continue
>end

10.提示“No source file named XXX”

有时我们想通过list命令来查看源文件时,gdb会提示"No source file named XXX"

原因一:产生这个问题的原因很可能是编译的时候没有添加-g选项

readelf --debug-dump=info [elf文件]   (可以查看文件中的.debug_info段,这个段记录了调试需要的信息,包括每个源文件的绝对路径信息,如果绝对路径下没有源文件则list [file:line_nume]会失败)

readelf --debug-dump=line [elf文件]   (可以查看文件中的.debug_line段,这个段记录了指令和源文件的行数对应的信息)

原因二:debug信息中的路径和源文件在文件系统中的路径不同,参考链接

https://www.cnblogs.com/rickyk/p/4184860.html

 

11.info

一.info source

查看当前执行代码的源文件信息,可以看到路径和编译选项(编译时添加-g才会有,不然会显示No current source file)

 

12.在python venv环境中在gdb中使用py-bt

参考链接:https://www.it1352.com/785520.html

进入到venv环境后,用strace gdb python &> aaaaa命令看gdb加载python的auto-load文件,在aaaaa中会提示python3.5-gdb.py找不到比如为/venv/path/to/python3.5-gdb.py,直接在相应的路径下建立软链接即可。用dpkg -L python3.5-dbg可以看到python3.5-gdb.py的路径/usr/share/gdb/auto-load/usr/bin/python3.5-gdb.py。可以建立如下软链接:

ln -s /usr/share/gdb/auto-load/usr/bin/python3.5-gdb.py  /venv/path/to/python3.5-gdb.py

注意:我用的python环境是python3.5不同的python版本时,文件名中的版本号不一样。

13.用py-bt查看python调用栈时出现如下情况:(参考链接:http://www.cocoachina.com/articles/111259

Python Exception <class 'RuntimeError'> Type does not have a target.:
Error occurred in Python command:Type does not have a target.

解决办法:

将/usr/share/gdb/auto-load/usr/lib/x86_64-linux-gnu/libpython3.5m.so.1.0-gdb.py文件中的

fields = gdb.lookup_type(‘PyUnicodeObject’).target().fields()

改成

fields = gdb.lookup_type(‘PyUnicodeObject’).fields()

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值