gdb的使用除了manual外,自带的帮助也是非常有用的。在debug过程中你可以输入help来查看gdb支持的调试命令。
List of classes of commands:
aliases -- Aliases of other commands
breakpoints -- Making program stop at certain points
data -- Examining data
files -- Specifying and examining files
internals -- Maintenance commands
obscure -- Obscure features
running -- Running the program
stack -- Examining the stack
status -- Status inquiries
support -- Support facilities
tracepoints -- Tracing of program execution without stopping the program
user-defined -- User-defined commands
用户可以借助 help breakpoints 进一步查看改大类下关于断点的所有命令。
调试程序的命令为 gdb ./program, 进入gdb界面后你可以 b命令来设置断点,具体如何设置将在下面讲述。如果该程序运行时需要参数,在gdb界面中输入 r arg1 arg2...即可。
调试进程的命令为,gdb,然后在gdb中 attach processid。即可对该进程进行调试。processid可以用top, ps -aux等命令得到。detach命令,使进程脱离GDB.
dir命令
当使用gdb时,一个自然想到的需求是gdb如何载入程序对应的源代码,特别是编译和运行目录都不包含源代码的情况。GDB默认会从编译目录和当前运行目录载入所需的源代码,如果你的源代码不在这两个目录中,那么必须通过dir path的方式载入。可以通过show directories 来查看你的源代码目录,个目录之间用“:”隔开。其中$cwd代表当前程序运行目录,$cdir代表编译目录。
watch命令
用来设置watch point,watch exp.当expression的值变化时,gdb会让程序自动会在这个地方停下来。由于watch point是根据上下文范围来设置的,所以先要在exp所在的函数中设置一个断点,停下来后再设置exp的watch point,以免把watch point 设置到全局变量。
rwatch awatch基本跟watch一样,rwatch是这个变量被访问时break,awatch是读写都break。使用watch时往往出现Could not insert hardware breakpoints: You may have requested too many hardware breakpoints/watchpoints.这个错误。一个是因为你设置的watchpoints数量过多,还有一个是因为你watch的变量超过了硬件能监控的范围。32位机器一般要求你的表达式是4bytes的,所以你监控一个float变量就可能出现这个问题,监控一个结构/类成员也可能出现这个问题。解决方法是直接获取你所要监控变量的地址,把他们拆成4byte的变量来监控。 如 watch b (char *)0xabcdef00
break命令
在函数入口除设置断点 b file:function 或者 b function。 gdb中于c++代码设置断点,需要指定完整的命名空间,例如b Dictionary:load 是对一个Dictionary类的成员函数load设置断点。 条件断点为 b file:function if cond. cond为源代码表达式。
tbreak 跟break命令一样,但这个命令设置的断点只break一次。以后就自动失效
clear命令
clear file:function对应与break命令,用来清楚断点(无法清楚watchpoint)。clear命令不带参数时默认是清楚当前行的断点,delete用来清楚断点和watchpoint,但delete的参数断点号(info break可以看到),不跟参数时为删除所有断点。
run命令
缩写 r, 开始启动程序, r arg1 arg2, arg1 arg2为命令行参数。
step命令
缩写s, 运行到下一行,碰到函数会进入函数。
next命令
缩写 n, 运行到下一行,碰到函数不会进入。
continue命令
缩写c,运行到下一个断点。 c 5, 运行到第5个断点停下。
finish命令
运行到函数返回处,如果有返回值就打印。
缩写p, p exp 打印出exp的值。
display
缩写disp, disp exp。打印处exp的值,与p的不同之处在于每执行一步都会打印这个exp的值,直到键入undisplay命令。
backtrace
缩写bt,可以查看函数的调用栈。
quit
退出gdb。
coredump
coredump是linux下非常有用的debug线索,它可以用 gdb ./program coredump载入,然后 bt infor reg 打印出你的程序是死在哪一行以及但是寄存器等信息。当然在编译时你必须加上-g选项。coredump对于多线程程序似乎支持的不是很好,多线程的 coredump文件似乎只是某个线程的而不是所有线程,而且无法确定这是coredump的线程或者是受害线程 。一般你多跑几次,估计会有受害线程被dump出来。
参考
gnu gdb manual
http://arioch.unomaha.edu/~jclark/gdb_plus.html