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()