1. 常用命令集合(快查、复制)
1.1 启动与文件加载
- 启动 gdb:
gdb -i=mi /path/to/executable(在 Emacs 中用M-x gdb后输入此命令) - 加载可执行文件:
file /path/to/executable - 设置程序运行目录:
cd /path/to/workdir - 添加源码搜索目录:
dir /path/to/source/dir - 查看当前加载文件:
info files - 查看 gdb 当前目录:
pwd
1.2 断点操作
- 按当前文件行号打断点:
b filename:lineno - 按完整路径打断点:
b /full/path/to/file.cpp:lineno - 按函数名打断点:
b function_name - 按类成员函数打断点:
b class::function - 查看所有断点:
info breakpoints(简写ib) - 删除某个断点:
delete breakpoint_num(简写d) - 删除所有断点:
delete - 禁用/启用断点:
disable breakpoint_num/enable breakpoint_num - 设置条件断点:
b filename:lineno if condition - 给已有断点加条件:
condition breakpoint_num condition - 清除断点条件:
condition breakpoint_num - 临时断点:
tbreak filename:lineno或tbreak function_name
1.3 运行与调试控制
- 运行程序:
run(简写r),带参数:run arg1 arg2 - 设置运行参数:
set args arg1 arg2 - 查看运行参数:
show args - 继续运行:
continue(简写c) - 停止程序:
Ctrl+C - 关闭程序:
kill - 退出 gdb:
quit(简写q) - 单步(不进函数):
next(简写n) - 单步(进函数):
step(简写s) - 执行完当前函数:
finish - 汇编级单步:
nexti/stepi
1.4 查看变量与内存
- 打印变量:
print variable(简写p) - 打印 this 指针:
p this - 打印数组前 N 个元素:
p array@N - 查看函数参数:
info args - 查看局部变量:
info locals - 设置变量值:
set var variable=value - 持续显示变量:
display variable - 查看自动显示列表:
info display - 取消自动显示:
undisplay num
1.5 调用栈与线程
- 查看调用栈:
backtrace(简写bt) - 查看完整栈:
bt full - 切换栈帧:
frame num(简写f) - 上/下切换:
up/down - 查看所有线程:
info threads - 切换线程:
thread thread_num - 所有线程栈:
thread apply all bt - 所有线程完整栈:
thread apply all bt full - 只让当前线程运行:
set scheduler-locking on
1.6 观察点
- 写入停住:
watch variable - 读取停住:
rwatch variable - 读写停住:
awatch variable - 查看/删除观察点:
info breakpoints/delete num
1.7 C++ 美化输出
set print pretty onset print object onset print static-members offset print elements 0(不限制字符串长度)set pagination off(不分页)
2. GDB 启动
| 操作 | 命令 |
|---|---|
| 启动 gdb | Alt+X gdb |
| 启动命令 | gdb -i=mi 可执行文件 |
| gdb 多窗口模式 | Alt+X gdb-many-windows |
| 切换源码和 gdb 窗口 | Ctrl+X O |
| 在源码当前行打断点 | Ctrl+X SPC |
3. 加载程序与源码路径
| 操作 | 命令 |
|---|---|
| 加载可执行文件 | file 文件路径 |
| 查看当前加载的可执行文件 | info files |
| 设置程序运行目录 | cd 目录路径 |
| 查看 gdb 当前目录 | pwd |
| 添加源码搜索目录 | dir 源码目录 |
| 查看源码 | list 文件名:行号 |
| 查看已知源码文件 | info sources |
4. GDB 断点操作
| 操作 | 命令 |
|---|---|
| 按当前文件行号打断点 | b 文件名:行号 |
| 按完整路径打断点 | b /完整路径/文件名.cpp:行号 |
| 按函数名打断点 | b 函数名 |
| 按类成员函数打断点 | b 类名:函数名 |
| 查看所有断点 | info breakpoints (简写 ib) |
| 删除某个断点 | delete 断点编号 (简写 d) |
| 删除所有断点 | delete |
| 禁用某个断点 | disable 断点编号 |
| 启用某个断点 | enable 断点编号 |
| 设置条件断点 | b 文件名:行号 if 条件 |
| 给已有断点加条件 | condition 断点编号 条件 |
| 清除断点条件 | condition 断点编号 |
5. 程序运行控制
| 操作 | 命令 |
|---|---|
| 运行程序 | run (简写 r) |
| 带参数运行 | run 参数1 参数2 |
| 关闭程序 | kill |
| 查看正在运行的程序 | info inferiors 或 info program |
| 设置运行参数 | set args 参数1 参数2 |
| 查看运行参数 | show args |
| 继续运行 | continue (简写 c) |
| 停止正在运行的程序 | Ctrl+C |
| 从头重新运行 | run |
| 退出 gdb | quit (简写 q) |
6. GDB 查看变量
| 操作 | 命令 |
|---|---|
| 打印变量 | print 变量名 (简写 p) |
| 打印 this 指针 | p this |
| 打印数组前 N 个元素 | p 数组名@N |
| 查看当前函数参数 | info args |
| 查看当前局部变量 | info locals |
| 设置变量值 | set var 变量名=值 |
| 持续显示变量 | display 变量名 |
| 查看自动显示列表 | info display |
| 取消自动显示 | undisplay 编号 |
| 格式化输出信息 | set print pretty onset print object onset print static-members off |
7. 单步调试
| 操作 | 命令 |
|---|---|
| 下一行,不进入函数 | next (简写 n) |
| 下一行,进入函数 | step (简写 s) |
| 执行完当前函数并返回 | finish |
| 执行到当前函数返回处 | finish |
| 继续到下一断点 | continue (简写 c) |
| 执行一条汇编指令,不进入函数 | nexti |
| 执行一条汇编指令,进入函数 | stepi |
8. 查看调用栈
| 操作 | 命令 |
|---|---|
| 查看调用栈 | backtrace (简写 bt) |
| 查看完整调用栈参数 | bt full |
| 切换到某一层栈帧 | frame 编号 (简写 f) |
| 上一层调用者 | up |
| 下一层被调用者 | down |
| 查看当前栈帧信息 | info frame |
9. 条件断点
| 操作 | 命令 |
|---|---|
| 设置条件断点 | b 文件名:行号 if 条件 |
| 给已有断点设置条件 | condition 断点编号 条件 |
| 清除条件 | condition 断点编号 |
| 查看断点条件 | info breakpoints |
| 临时断点,命中一次后删除 | tbreak 文件名:行号 |
| 设置临时函数断点 | tbreak 函数名 |
10. 观察点 Watchpoint
| 操作 | 命令 |
|---|---|
| 变量被写入时停住 | watch 变量名 |
| 变量被读取时停住 | rwatch 变量名 |
| 变量被读取或写入时停住 | awatch 变量名 |
| 查看 watchpoint | info breakpoints |
| 删除 watchpoint | delete 编号 |
11. 查看源码
| 操作 | 命令 |
|---|---|
| 显示当前源码附近 | list |
| 显示指定行附近源码 | list 文件名:行号 |
| 显示函数源码附近 | list 函数名 |
| 向后继续显示源码 | list |
| 向前显示源码 | list - |
12. C++ 常用设置
| 操作 | 命令 |
|---|---|
| 美化打印结构体/对象 | set print pretty on |
| 打印对象时显示派生类型 | set print object on |
| 不限制字符串打印长度 | set print elements 0 |
| 不分页输出 | set pagination off |
| 打开分页输出 | set pagination on |
| 显示完整函数名 | set print asm-demangle on |
| 设置输出内容 | set print elements 100set print repeats 10set print null-stop on |
13. 多线程调试
| 操作 | 命令 |
|---|---|
| 查看所有线程 | info threads |
| 切换到某个线程 | thread 线程编号 |
| 查看所有线程调用栈 | thread apply all bt |
| 查看所有线程完整调用栈 | thread apply all bt full |
| 只让当前线程运行 | set scheduler-locking on |
| 恢复所有线程运行 | set scheduler-locking off |
14. 动态库相关
| 操作 | 命令 |
|---|---|
| 查看已加载动态库 | info sharedlibrary |
| 设置动态库搜索路径 | set solib-search-path 路径 |
| 程序运行后再加载符号 | sharedlibrary |
| 查看某函数地址 | info address 函数名 |
| 查看函数列表 | info functions 关键字 |
15. Emacs+GDB 常用操作
| 操作 | 命令 |
|---|---|
| 启动 gdb | Alt+X gdb |
| 启动 gdb 命令 | gdb -i=mi /skrd/huangwj/work/lski/ski/dbg/bin/skipper |
| 切换源码/gdb 窗口 | Ctrl+X O |
| 源码当前行打断点 | Ctrl+X SPC |
| 只保留当前窗口 | Ctrl+X 1 |
| 打开 gdb 多窗口 | Alt+X gdb-many-windows |
| 跳到指定行 | Alt+G G |
| 打开源码文件 | Ctrl+X Ctrl+F |
补充细节:
- 在 Emacs 中启动 gdb 时,建议使用
gdb -i=mi方式,这样能更好地与 Emacs 集成,支持点击断点、变量可视化等。 - 条件断点中的“条件”是 C/C++ 表达式,例如
b main.cpp:42 if x == 5。 watch观察点需要硬件断点支持,如果变量不在作用域内可能无法设置。- 多线程调试时,如果希望其他线程不干扰当前线程,可打开
set scheduler-locking on。