这篇文章上次修改于 766 天前,可能其部分内容已经发生变化,如有疑问可询问作者。

1 使用 gdb 调试 c++ 注意事项

在编译选项中加入 -g set(CMAKE_CXX_FLAGS "-g")

2 进入 gdb 调试模式

对于一个可执行文件,进入 gdb 调试模式:

  • 直接使用 gdb filename 进入
  • 先进入 gdb 调试模式,再使用 filename 装载该文件

3 gdb 常用指令

3.1 一般指令

run/r:运行

continue/c:在断点之后继续运行

next/n:单步运行

step/s:单步运行,遇到函数会 step into

list:显示函数,默认显示的行数为 10,可通过 set listsize 20 把默认的显示改为 20

set args:设置参数

show args:显示设置的参数

3.2 breakpoint, watchpoint

break/b: 设置断点。args:

  • linenum:在当前 source file 指定行加断点
  • +offset:在当前的 +offset 处设置断点
  • function:在指定的函数加断点,对于 c++,可以加上类名和命名空间,如 b A:func
  • if cond:当条件为真是加断点

设置 watchpoint:

  • watch variable:程序会在 variable 的值改变之后停止。

查看,删除,disable 断点:

  • info breakpoint:显示所有断点
  • clear:删除当前行的断点
  • delete/d:删除所有断点
  • delete n:删除第 n 个断点
  • disable n:禁用第 n 个断点
  • enable n:启用第 n 个断点

显示程序中变量的值

  • print:打印变量的当前值
  • display:每当程序停止时打印该变量的值
  • 可以使用 delete 和 disable 删除/禁用要 display 的变量

改变程序的运行

  • print i=100:将变量 i 的值改为 100
  • jump linenum:跳转到特定的行
  • return:强制函数返回
  • call func():强制调用函数

分析程序崩溃原因

  • backtrace/bt: 查看调用堆栈
  • frame n:进入相应的代码段