开发工具——gdb

1. 启动gdb

1.1 vim 使用gdb

需要vim8+ gdb7+
vi main.c
:packadd termdebug
:Termdebug ./a.out

2. 设置断点

break function
break linenum
break filename:function
break filename:linenum

break [args] if [cond]
当 运算式 cond 为真,设置断点, args 为上面任意一种。

tbreak [args]
只会生效一次的断点

rbreak regex
使用正则寻找可能的函数,并在其入口点设置断点,如 rbreak . 给每个函数设置断点。

info break
查看断点

3. 设置观察点

观察点用于查看变量有没有变化,若有变化,立即暂停程序。

watch expr
当变量expr 有变化,暂停程序

rwatch expr
当变量expr被读,暂停程序

awatch expr
当变量expr被读或被写,暂停程序

info watchpoints
查看所有观察点

4. 维护停止点

4.1 清除停止点

clear
清楚所有断点

clear function
clear linenum
clear filename:linenum
clear filename:function
清除指定断点

4.2 禁用断点

disable
禁用所有断点

disable 断点号

4.3 启用断点

enable

enable 断点号

4.3 修改条件断点

condition bnum expression
修改 断点号为num 的 停止条件为 expression

4.4 忽略断点

ignore bnum count
忽略断点几次

5. 程序运行控制

continue
继续执行到下一个断点

step
单步跟踪,若有函数,则进入函数

next
单步跟踪,但不进入函数

finish
运行程序,直到当前函数结束

until
执行一行程序,若此时程序在 for/while/do 循环最后一行,则一直执行到循环结束

6. 查看运行时的数据

6.1 变量

print var
查看变量的值

6.2 表达式

print expr
gdb支持根据 表达式计算变量,表达式为当前语言语法。
下面是扩展的操作符

  • @ 数组相关
  • :: 指定一个文件或一个函数的变量
  • {} 表示一个指向内存地址为type类型的对象

6.3 数组

动态数组
若有如下数组定义
int *arr = (int *)malloc(len * sizeof(int));
gdb中查看数组
p *arr@len

静态数组
直接用 print 数组名

6.4 输出格式

支持的格式
x 16进制
d 10进制
u 16进制无符号
o 8进制
t 2进制
c 字符格式
f 浮点数格式

实例
使用16进制显示变量i
p/x i
使用浮点数格式显示i
p/f i

7. 自动显示

display expr
display/fmt expr
display/fmt addr

删除自动显示
undisplay dnum ..
disable/enable/delete display dnum ...

posted on 2022-03-08 10:28  开心种树  阅读(64)  评论(0编辑  收藏  举报