以下是 GDB 10.2 的常用调试命令分类整理,涵盖基本调试、断点管理、变量查看、多线程/多进程调试等场景,方便快速查阅:
1. 启动与退出
命令 |
说明 |
gdb <可执行文件> |
启动 GDB 并加载程序 |
gdb --args <程序> <参数> |
带参数启动程序 |
gdb -p <PID> |
附加到正在运行的进程 |
★ quit 或 q |
退出 GDB |
2. 运行程序
命令 |
说明 |
run 或 r |
从头运行程序 该命令有些版本不支持 |
run <arg1> <arg2> |
带命令行参数运行 该命令有些版本不支持 |
★ continue 或 c |
继续运行到下一个断点 |
kill |
终止正在调试的程序 |
Ctrl+C |
中断程序执行(暂停) |
3. 断点管理
命令 |
说明 |
★ break <函数名> 或 b main |
在函数入口设断点 |
★ break <文件:行号> 或 b src.c:10 |
在指定文件的某行设断点 |
break *<地址> 或 b *0x4005a0 |
在内存地址处设断点 |
break if <条件> 或 b 10 if x==5 |
条件断点 |
info breakpoints 或 i b |
查看所有断点 |
★ delete <编号> 或 d 2 |
删除指定断点 |
clear <位置> 或 clear main.c:10 |
删除某位置的断点 |
disable/enable <编号> |
禁用/启用断点 |
4. 单步执行
命令 |
说明 |
★ next 或 n |
执行下一行(不进入函数) |
★ step 或 s |
执行下一行(进入函数) |
nexti 或 ni |
执行下一条机器指令(不进入函数) |
stepi 或 si |
执行下一条机器指令(进入函数) |
finish |
执行到当前函数返回 |
until 或 u |
执行到当前循环结束 |
5. 查看代码与堆栈
命令 |
说明 |
★ list 或 l |
显示当前行附近的代码 |
list <函数名> |
显示指定函数的代码 |
list <文件:行号> |
显示指定位置的代码 |
backtrace 或 bt |
查看调用栈(栈帧) |
frame <编号> 或 f 1 |
切换到指定栈帧 |
info frame |
查看当前栈帧详细信息 |
6. 查看变量与内存
命令 |
说明 |
★ print <变量> 或 p x |
打印变量值 |
print/x <变量> |
十六进制格式打印 |
print/d <变量> |
十进制格式打印 |
print/t <变量> |
二进制格式打印 |
display <变量> |
每次停顿时自动打印变量 |
undisplay <编号> |
取消自动显示 |
x/<格式> <地址> |
查看内存(如 x/4xw &x ) |
格式说明 |
x =十六进制, d =十进制, t =二进制, w =4字节, h =2字节 |
7. 修改程序状态
命令 |
说明 |
set var <变量>=<值> |
修改变量值(如 set var x=10 ) |
jump <行号或地址> |
跳转到指定位置继续执行 |
return |
强制当前函数立即返回 |
8. 多线程/多进程调试
命令 |
说明 |
info threads |
查看所有线程 |
thread <ID> |
切换到指定线程 |
thread apply all <命令> |
对所有线程执行命令(如 thread apply all bt ) |
set follow-fork-mode child/parent |
设置跟踪子进程或父进程 |
9. 共享库调试
命令 |
说明 |
info sharedlibrary |
查看已加载的共享库 |
set solib-search-path /path |
设置共享库搜索路径 |
set sysroot /path |
设置目标机的系统根目录 |
sharedlibrary <库名> |
手动加载共享库符号 |
10. 高级命令
命令 |
说明 |
watch <变量> |
设置观察点(变量被修改时暂停) |
catch throw |
捕获 C++ 异常 |
tui enable |
启用文本用户界面(分屏模式) |
record full |
开启执行记录(支持反向调试) |
reverse-step |
反向执行(需先 record full ) |
11. 调试核心转储文件
gdb <可执行文件> <core文件>
bt
示例调试流程
- 编译带调试信息的程序:
gcc -g -o demo demo.c
- 启动 GDB:
gdb ./demo
- 设置断点并运行:
(gdb) b main
(gdb) run
- 单步调试:
(gdb) n
(gdb) s
(gdb) p x
常见问题解决
- 断点无效:检查编译时是否加了
-g
,或尝试 break *<地址>
。 - 符号未加载:用
set solib-search-path
指定库路径。 - 多线程调试混乱:用
thread apply all bt
查看所有线程堆栈。
掌握这些命令后,可以高效调试大多数 C/C++ 程序问题。如需更复杂功能(如 Python 脚本扩展),可查阅 GDB 官方文档。