编译程序时添加调试信息

为了让 GDB 能够读取源码并关联变量信息,你必须在编译时加入调试符号。
例如,对于 C 程序,可以这样编译:

1
gcc -g -o my_program my_program.c

对于 C++ 程序,则用:

1
g++ -g -o my_program my_program.cpp

启动 GDB

在终端中输入以下命令启动 GDB 调试器,并加载可执行文件:

1
gdb my_program

进入 GDB 后,会看到提示符 (gdb),这时就可以开始调试了。


常用 GDB 命令

查看源码和设置断点

  • list (l)
    显示源码,默认显示当前停留位置附近的代码。
1
(gdb) list
  • break (b)
    在指定的函数或行设置断点。
    示例:在 main 函数入口设置断点:
1
(gdb) break main

或在具体文件的某一行设置断点:

1
(gdb) break my_program.c:20

启动和控制程序运行

  • run (r)
    启动程序执行,可以附带命令行参数。
    1
    (gdb) run arg1 arg2
  • continue (c)
    当程序在断点处停止后,继续执行到下一个断点或程序结束。
    1
    (gdb) continue
  • step (s)
    单步执行代码,遇到函数调用时会进入该函数内部。

    1
    (gdb) step
  • next (n)
    单步执行代码,但不会进入函数内部,而是整体执行完当前行的函数调用。

    1
    (gdb) next
  • finish
    执行完当前函数,返回到调用该函数的地方,并暂停。

    1
    `(gdb) finish`

    查看变量和表达式

  • print (p)
    打印变量或表达式的值。

1
(gdb) print x
  • display
    设置表达式,使得每次程序暂停时自动显示其值。
    1
    (gdb) display x
  • info locals
    查看当前函数内所有局部变量的值。
    1
    (gdb) info locals

查看调用堆栈

  • backtrace (bt)
    显示当前的调用堆栈,有助于追踪程序是如何进入当前状态的。
    1
    (gdb) backtrace

观察点和条件断点

  • watch
    设置观察点,当某个变量或内存位置的值发生变化时暂停程序。

    1
    (gdb) watch x
  • rwatchawatch
    分别用于在读取(rwatch)和读写(awatch)变量时触发暂停。

    1
    (gdb) rwatch x (gdb) awatch x
  • 条件断点
    仅在满足特定条件时才触发断点。
    例如,在 my_function.c 文件的第 50 行,当变量 x 等于 10 时才停下:

    1
    (gdb) break my_function.c:50 if x == 10

辅助命令

  • info breakpoints
    查看当前所有设置的断点信息。
    1
    (gdb) info breakpoints
  • delete
    删除指定编号的断点。
    1
    (gdb) delete 1
  • set args
    设置程序启动时的命令行参数(在启动 run 前设置)。
    1
    (gdb) set args arg1 arg2
  • help
    获取某个命令的帮助信息。
    1
    (gdb) help break
  • quit (q)
    退出 GDB。
    1
    (gdb) quit

    🌟 推荐:加个 gdb TUI 界面

在 gdb 里输入:

1
(gdb) layout src

就会进入 分屏模式,上面看代码,下面调试,非常舒服。