GDB调试指南
- 操作使用
- 使用场景
操作使用
进入gdb调试
- gdb ./helloworld
- 后台进入gdb调试:sudo gdb attach PID
r/run 开始/重新开始执行应用程序,应用程序重头开始,直到遇到断点
list列出源码,持续键入回车,代码向后展开
n/next 单步执行,单步调试
回车 重复执行上条命令
focus 显示源码 ctrl+x A 退出focus
finish/fin 结束当前函数
s 跳入函数
b func/line 用于设置断点,可以在文件某一行,某个函数等
del 1 删除1号断点
dis 1 关闭1号断点
en 1 打开1号断点
info b 查看所有断点
info register 查看寄存器
p var 打印变量,可以打印当前所有变量,打印类型需要匹配
x /10 ptr 向上dump ptr附近的10个字节内容
set var 设置变量值
bt 查看调用栈
watch 观察点(地址),当地址中的内容发生变化,程序会停下来
condition 当 0x565d046c 的内容被修改成 0 时停下来
frame 3 跳到栈的第三层,方便查看当前栈信息
c 继续执行,直到下一个断点
disassemble func 对函数进行反汇编
disassemble /m ptr 反汇编出指针附近的代码
q 退出GDB
使用场景
- 异常退出
- 场景:运行程序,报错、程序异常crash退出,程序终止
- 解决方法: gdb lunch程序,输入r正常运行,当程序终止时,可以使用gdb命令bt查看调用栈,排查问题
- ** 忙等待**
- 场景: 运行程序,终端卡住,不能输出任何内容
- 解决方法:
A. 可以在后台查看当前程序的pid,使用sudo gdb attach pid,接手程序运行,使用命令bt查看调用栈,排查问题。
B. pkill -SIGSTOP nuttx
C. kill -19 pid
- 变量被改
- 场景: 运行程序,多线程,一个变量被修改,但不知道是谁
- 解决方法: gdb lunch程序,然后使用命令watch 加变量的地址,当变量内容发生变化时,程序停止,使用bt查看调用栈,排查问题。
- 函数异常返回
- 场景: 运行程序,函数异常返回,但不知道对应哪个逻辑
- 解决方法: gdb lunch程序,然后使用命令b 加函数名称,设置断点,r运行,当程序停下来时,使用n或者s进行单步跟踪,直到异常退出