r (run) | 运行程序 |
b (breakpoint) | 打断点,比如 b func(打到函数) b 5(打到第5行)(当前文件) b main.cpp:5(main.cpp的第5行) b MyClass::func() (打到类的成员函数func()、在类内可以 p this 打印、p *this、p this->name) |
tb (temporary breakpoint) | 临时断点,用法同 b |
c (continue) | 继续执行代码,直到下一个断点 |
n (next) | 执行下一行代码,但是不会进入函数内部 |
s (step) | 执行下一行代码,并进入函数内部 (单步调试) 如果陷入步进后,可以按c跳出继续执行代码 |
p (print) | 打印变量的值 |
bt (backtrace) | 打印函数调用栈 |
f (finish) | 执行到当前函数返回为止 |
d (delete) | 删除断点,d <breakpoint number> 删除指定断点 d 删除所有断点 |
cl (clear) | 同delete,也是删除断点,cl <breakpoint number> 删除指定断点 cl 删除所有断点 |
watch | 监视一个变量或者一段内存 比如监视 n => watch n 条件监视 => watch n if n >= 2 |
awatch | 监视写 |
rwatch | 监视读 |
g 或 k | 退出调试器 |
tui enable | 吊炸天的图形界面调试 |
layout src | 同为吊炸天的图形界面调试 |
layout asm | 显示为汇编语言 |
u (until) | 快速运行完当前的循环体,并运行至循环体外停止 |
i b | 查看断点信息,相当于 info breakpoints |
一些小技巧
- gdb的带参调试:先正常进入gdb调试模式:gdb build/main,然后 run 的时候带参进入,如 r -l -a -o a.txt 等。
这样第二次 run 的时候会带同样的参数
- 启动 gdb 调试的时候,使用命令 gdb "build main" -ex 'b main',这样启动后会自动跳转到main函数
- 同理,也可以通过刚才的 -ex 命令指定多个命令
调试配置的保存
- 进入gdb调试模式后,比如设置了一些断点后,想要把这些配置保存下来 (这里主要指断点的设置),则
save breakpoints codingai.gdb
,然后下次再进入调试时加载 source codingai.gdb
,这样就重新把调试配置加载进来了
要在两个不同的终端调试
先启一个 main,然后到另一个终端
查找进程pid
ps -A | grep main
# 或
pidof main
# 比如 312312
则继续,在另一个终端中
sudo gdb
# 加载符号
attach 312312
接下来可以正常调试,且两个终端之间是不影响的