GDB 学习笔记
在使用 gdb
进行调试时,编译时需要加上 -g
参数,以确保生成包含调试信息的可执行文件。
常用命令
程序控制
-
run(r)
[arg1 arg2 ...]
从头开始运行程序直到结束或遇到断点,后面可以添加命令行参数。 -
continue(c)
从当前位置开始继续执行,直到下一个断点或程序结束。 -
next(n)
执行一行代码,停在下一行代码。不会进入函数内部。 -
step(s)
单步执行,遇到函数调用时进入函数内部。 -
finish
执行完当前函数并返回到调用此函数的那一行。 -
reverse-next(rn)
逆向执行代码一步,返回到上一条已执行的代码。
说明:reverse-*
系列命令要求gdb
支持逆向调试功能(可能需要开启记录模式)。
断点和观察点
-
break(b)
[location]
在指定位置(如main
或行号)设置断点。 -
watch
<variable>
设置观察点,当指定变量的值发生变化时暂停程序执行并打印变化。 -
info breakpoints
显示所有断点及观察点的信息。 -
delete
<breakpoint_id>
删除指定 ID 的断点;不加 ID 将删除所有断点。
栈帧与调用栈
-
backtrace(bt)
显示当前调用栈,列出每个栈帧的函数及参数信息。 -
up
[num]
切换到调用栈中的上num
层(更接近主函数)栈帧。 -
down
[num]
切换到调用栈中的下num
层(更接近当前函数调用)栈帧。
变量和表达式
-
print(p)
<expression>
打印表达式或变量的值。 -
display
<expression>
每次程序停止时自动显示表达式的值。 -
undisplay
<display_id>
停止显示指定的自动打印项。 -
whatis
<variable>
打印变量的类型信息。 -
set var
<variable>=<value>
设置变量的值。
代码浏览
- list(l)
显示当前代码行的上下文。可以用list <行号>
查看指定行附近的代码。
退出调试
- quit(q)
退出gdb
。
备注
gdb
支持多种参数和脚本方式,建议在调试复杂项目时使用脚本化方法来简化调试流程。- 有些高级命令(如逆向命令)需要
gdb
支持记录模式,可通过target record
启动。