GDB和CGDB

gdb(cgdb) 是一款用于测试携带调试信息的exe的软件,主要功能类似于windows平台中Visual Studio的debug模式

其中 cgdb 是有可视化的实时代码显示,两者的主要功能都是一致的

基本操作

gdb会自动记录最新的一条指令,直接按 回车键 可以快速执行上一条指令

编译

在编译程序时,加入调试信息

1
gcc -g program.c -o program  # -g 选项生成调试符号

进入gdb调试

./bin 代表的是上文中编译时带有调试信息的exe程序

1
gdb ./bin

退出调试

1
quit

查看源码

list 也可以简写成 l

1
2
3
4
list [行号]           # 查看指定行附近的代码
list [文件名]:行号 # 查看指定文件的指定行
list [函数名] # 查看指定函数的代码
list # 继续显示后续代码(按回车键翻页)

按下 ESC 进入源代码窗口,查看源码,再按 i ,回到调试页面

断点操作

打断点

  • 断点只有打断点操作使用行号,其他所有断点相关操作均要用断点编号
1
b [行号]/[函数名]/[函数名:行号]/[文件名:行号]
  • 条件断点,符合条件时才会停止,只会被触发一次
1
b 行号 if 条件

查看所有断点

1
info b

删除断点

1
d [断点编号]

禁用和启用

可以同时禁用或启用多个断电,编号之间用空格隔开

1
2
disable	 [断点编号]	// 禁用断点
enable [断点编号] // 启用断点

设置条件

给已存在的断点设置条件

1
condition 断点号 条件(没有if)

调试操作

运行至下一个断点

1
c(continue)

从头开始运行程序

1
r(run)

逐过程

1
n(next)

逐语句

1
s(step)

查看函数栈

1
bt

直接执行完当前函数

1
finish

打印变量值或表达式

1
p [变量名]/[表达式]/[指针]/[结构体/类 成员]/...

快捷执行

  • 直接执行可以快速执行到循环体外
1
until
  • 执行到指定行号 或 函数完毕
1
2
until [指定行号]
until foo // 执行到foo函数结束

查看上下文

查看上下文数据(相当于vs的监视)

每次程序中断(如断点、单步执行后),GDB 会自动显示已设置的变量值

1
display [变量名]/[表达式]/...

取消指定变量的监视

1
undisplay [变量名]/[表达式]/...

查看函数内所有变量

快速查看当前函数栈帧中所有局部变量

1
info locals

监视指定变量

监视指定变量是否有变化,产生一个hw断点(不会在运行时停止),用d删除

当被监控的值被修改时,GDB 会自动暂停程序

1
watch [变量名]/[表达式]/...

临时修改变量

调试期间临时修改变量值以确认错误原因

1
set ver 变量=值

例子:

1
set var flag=1

调试技巧

  • 断点的本质是将代码进行块级别的划分,以块为单位进行快速定位区域

  • 通常用二分法查找错误行

  • 使用finish判断问题是否在函数内

  • 使用until局部区域快速执行

  • watch监视某些变量,一旦本不该被修改的变量发生变化,会立马提醒

  • set var修改变量值,确定错误原因