gdb常用调试命令概览和说明
run命令
在默认情况下,gdb+filename只是attach到一个调试文件,并没有启动这个程序,我们需要输入run命令启动这个程序(run命令被简写成r)。如果程序已经启动,则再次输入 run 命令就会重启程序。
continue命令
在程序触发断点或者使用 Ctrl+C 组合键中断后,如果我们想让程序继续运行,则只需输入 continue 命令即可(简写成 c)。当然,如果通过 continue 命令让程序在继续运行的过程中触发设置的程序断点,则程序会在断点处中断。
break命令
break 命令即我们添加断点的命令,可以将其简写成 b。
##在functionname函数的入口处添加断点
break functionname
##在当前文件行号为LineNo的地方添加一个断点
break LineNo
##在filename 文件行号为LineNo的地方添加一个断点
break filename:LineNo
tbreak命令
break 命令用于添加一个永久断点;tbreak 命令用于添加一个临时临时断点。
backtrace与frame命令
backtrace 可简写成 bt,用于查看当前所在线程的调用堆栈。如果我们想切换到其他堆栈处,则可以使用frame命令。frame命令可被简写成f。
frame 堆栈编号
info break、enable、disable、delete命令
在程序中加了很多断点以后,若想查看加了哪些断点,则可以使用info break命令
如果我们想禁用某个断点,则使用 disable 断点编号就可以禁用这个断点了,被禁用的断点不会再被触发;被禁用的断点可以使用enable断点编号并重新开启。
如果disable和enable命令不加断点编号,则分别表示禁用和启用所有断点
使用delete编号可以删除某个断点。如果输入delete时不加命令号,则表示删除所有断点。
list命令
list命令用于查看当前断点附近的代码,可以简写成l。
list+命令(即list加号)可以从当前代码位置向下显示10行代码(向文件末尾方向)。list-命令(即list 减号)可以从当前代码位置向上显示10行代码(往文件开始方向)。
print与ptype命令
print命令可以被简写成 p。通过 print命令可以在调试过程中方便地查看变量的值,也可以修改当前内存中的变量值。通过 print命令不仅可以输出变量的值,也可以输出特定表达式的计算结果,甚至可以输出一些函数的执行结果。
通过 print命令不仅可以输出表达式的结果,还可以修改变量的值
info与thread命令
info命令是一个复合指令,可以用来查看当前进程所有线程的运行情况。
info命令还可以用来查看当前函数的参数值,组合命令是info args。
next、step、until、finish、return、jump命令
next命令可被简写为n,next命令的调试术语叫“单步步过(step over)”,即遇到函数调用时不进入函数体内部,而是直接跳过。
step命令就是“单步步入(step into)”,顾名思义,就是遇到函数调用时进入函数内部。step可被简写为 s。
return命令用于结束执行当前函数,同时指定该函数的返回值
finish命令用于执行完整的函数体,然后正常返回到上层调用中
until 命令,可被简写为u,我们使用这个命令让程序运行到指定的行停下来
jump命令的基本用法如下:
jump <location>
location可以是程序的行号或者函数的地址,jump会让程序执行流跳转到指定的位置执行,其行为也是不可控的
在gdb命令行界面直接按下回车键,默认是将最近一条命令重新执行一遍
set args与show args命令
很多程序都需要我们传递命令行参数。在gdb调试中使用gdb filename args这种形式给被调试的程序传递命令行参数是行不通的。正确的做法是在用gdb attach程序后,使用run 命令之前,使用 set args 命令行参数来指定被调试程序的命令行参数。可以通过show args查看命令行参数是否设置成功。
如果在单个命令行参数之间有空格,则可以使用引号将参数包裹起来。
如果想清除已经设置好的命令行参数,则使用set args不加任何参数即可。
watch命令
watch是一个强大的命令,可以用来监视一个变量或者一段内存,当这个变量或者该内存处的值发生变化时,gdb就会中断。监视某个变量或者某个内存地址会产生一个观察点(watch point)。
需要注意的是:当设置的观察点是一个局部变量时,局部变量失效后,观察点也会失效。
display命令
display 命令用于监视变量或者内存的值,每次 gdb 中断,都会自动输出这些被监视变量或内存的值。
display命令的使用格式是display 变量名/内存地址/寄存器名。
我们可以使用info display查看当前已经监视了哪些值,使用delete display清除全部被监视的变量,使用delete display 编号移除对指定变量的监视。
dir命令
可执行程序崩溃,我们用gdb调试core文件时,gdb可能会提示“No such file or directory”。
gcc/g++编译出来的可执行程序并不包含完整的源码,-g 只是加了一个可执行程序与源码之间的位置映射关系,我们可以通过dir命令重新定位这种关系。
##加一个源文件路径到当前路径的前面,指定多个路径,可以使用“:”
dir SourcePath:SourcePath2:SourcePath3
SourcePath1、SourcePath2、SourcePath3 指的就是需要设置的源码目录,gdb 会依次到这些目录下搜索相应的源文件。
如果要查看当前设置了哪些源码搜索路径,则可以使用show dir命令。
dir命令不加参数时,表示清空当前已设置的源码搜索路径。