gdb调试手册

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:linenotbreak 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 on
  • set print object on
  • set print static-members off
  • set 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 inferiorsinfo 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
0
所有评论 0