gdb
编译程序时添加调试信息
为了让 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
rwatch 和 awatch
分别用于在读取(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 |
就会进入 分屏模式,上面看代码,下面调试,非常舒服。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 梦始!
评论
