GDB 使用
gdb 调试
善用 gdb 的 help 文档
启动 gdb
-
对 C/C++程序的调试,需要在编译前就加上-g 选项:
1
$g++ -g hello.cpp -o hello
-
调试可执行文件:
1
$gdb <program> [corefile]
或
1 | $gdb |
program 为可执行文件名
core-file 为 core dump 结果,
关于 core
core dump 意为“磁芯倾印”,是操作系统在进程收到某些信号而终止运行时,将此时进程地址空间的内容以及有关进程状态的其他信息写出的一个磁盘文件
应使用ulimit -c unlimited开启 core dump ,然后执行代码以生成 core 文件
gdb 交互命令
启动 gdb 后,进入到交互模式,通过以下命令完成对程序的调试;注意高频使用的命令一般都会有缩写
-
交互模式下直接回车则重复上一指令
-
运行
-
cd <directory>指定工作目录 -
pwd查看工作目录 -
run [参数1 [参数2]...] [流重定向](r) 给定参数运行程序,默认使用上次的参数 -
set args设定参数 -
show args显示参数 -
tty <流>设定流 -
kill(k) 终止被调试进程 -
quit(q) 退出 gdb
-
continue(c) 继续执行,直到下一个断点处 -
next [行数](n) 单行调试,当遇到函数调用时,不进入此函数(step-over) -
nexti [指令数](ni) 单步机器指令调试,step-over -
step [行数](s) 单行调试,如果有函数调用,进入函数 (step-into) -
stepi [指令数](si) 单步机器指令调试,step-into -
until(u) 继续运行程序直到退出循环体 -
until <行号>运行至某行 -
finish(f) 运行程序,直到当前函数完成返回,并打印函数返回时的堆栈地址和返回值及参数值等信息 -
return <返回值>立即结束函数并手动设置返回值 -
call <函数(参数)>调用程序中可见的函数,并传递参数,例call gdb_test(55)
-
-
回退调试
回退调试用于撤销,仅支持少数平台(比如 amd64-linux)
-
record开启记录以反向调试 -
record stop停止记录 -
set exec-direction (forward/reverse)设置运行方向与一般调试相同但是方向相反的:
-
reverse-continue(rc) -
reverse-finish -
reverse-next(rn) -
reverse-nexti(rni) -
reverse-step(rs) -
reverse-stepi
-
-
设置断点
遇到断点后,程序会在断点处停止运行,等待用户输入下一步的命令
break n(b) 在第n行处设置断点,或在指定文件对应行设置断点b main.c:578break 函数名在函数的入口处设置断点,例break mainbreak *内存号在内存号处设置断点,例break *0x3400abreak 行号或者函数名 if a>b条件断点设置watch 表达式设置一个监视断点,一旦被监视的表达式的值改变,将暂停运行delete [n]删除第 n 个断点clear [n]清除第 n 行的断点disable [n]停用第 n 个断点enable [n]启用第 n 个断点info breakpoints(info b) 显示当前程序的断点设置情况
-
堆栈
backtrace [n](bt) 打印堆栈帧号及相关信息,n有符号,指定打印数frame <帧号|地址>(f) 查看堆栈帧详情up [n](u) 向上(帧号更大)down [n](d) 向下(帧号更小)
-
查看源代码
list(l) 从上一次list命令之后,列出程序的源代码,默认每次显示 10 行list 行号将显示当前文件以此行为中心的前后 10 行代码list 函数名将显示函数的源代码
-
打印表达式
print 表达式(p) 打印任何当前正在被测试程序的有效表达式whatis查询表达式类型display 表达式将在每次暂停运行后,自动输出被设置的表达式及值undisplay 表达式取消 displayinfo display显示当前所有要显示值的表达式的情况
-
shell
shell 命令来运行 shell 命令