感谢狄泰唐老师
1. 作用
? 跟踪程序执行
? 恢复程序崩溃前的状态
? gdb是动态的工具,常用的addr2line这种是静态的
2. 一般应用
1. 自定义程序的启动方式(执行影响程序运行的参数)
2. 设置条件断点 (在条件满足的时候暂停程序的执行)
3. 回溯检查导致程序崩溃的原因(Core Dump)
4. 改变程序的执行流 (定位问题的辅助方式)
3. 实例应用
-
启动
-
gdb
file 可执行程序
-
gdb 可执行程序
-
gdb 可执行程序 CoreDump
直接恢复发生段错误的信息
-
动态链接
-
sudo gdb 可执行程序名称 pid
-
sudo gdb
attach pid
-
常规启动
gdb
file 可执行程序
set args arg1 arg2
run
- 动态
gdb
attach pid
continue
- 得到core dump文件
ulimit -c unlimited
gdb a.out core
-
4. 断点
### 1. 类型
? 软件断点: 由非法指令异常实现,用于执行于内存中的程序
? 硬件断点: 由硬件特性实现,用于执行于Flash中的程序(代码处于Flash中只能通过硬件断点调试)
? 数据断点:由硬件特性实现,监控内存 程序中 某个数据被访问/修改
2. 断点操作
-
通过函数名
break func_name [if var = name]
后面的代表是条件断点可以增加的条件,[]可以忽略
tbreak func_name [if var = name]
临时断点
hbreak func_name [if var = name]
硬件断点
- 通过文件名行号设置断点
break file_name:line_num [if var = name]
treak file_name:line_num [if var = name]
hreak file_name:line_num [if var = name]
- 查看断点
info breakpoints
- 断点删除
delete 1 2 n
delete breakpoints
- 断电状态改变
enable 1 2 n
enable breakpoints
disable 1 2 n
disable breakpoints
3. 断点说明
? 一般打断点都会出现下面的信息,代表 printf("st[%d].i = %d\n", i, st[i].i);代表下一次要执行的语句,当前停在这里还没执行
? Breakpoint 4, func () at tricks.c:24
? 24 printf("st[%d].i = %d\n", i, st[i].i);
5. 常用操作
-
查看变量
print name
- 开始执行,并停在最开始
start
- 变量设置
set var xx=100
- 执行下一行代码,不进入函数体
next
- 连续执行n行代码
next n
- 执行下一行代码,进入函数体
step
- 强制当前函数返回 return [value]
return value
- 运行至当前函数返回
finish
- 运行至目标行
until line
- 跳转执行
jump line
- 查看可以使用的硬件断点个数
show can-use-hw-watchpoints
6. 数据断点 观察感兴趣的变量变化
-
本质为硬件断点
-
用法
watch var_name
7. 直接查看任意内存的值
-
语法
x /Nuf expression
N — 需要打印的单元个数
u — 每个单元的大小
f — 数据打印的格式
- u可能的参数值
b 单字节
h 双字节
w 四字节
g 八字节
- f 可能的格式
x 十六进制
d 有符号十进制
u 无符号十进制
o 八进制
t 二进制
a 地址
c 字符
f 浮点数
- 示例
x /4bx 0x804a024
8. 通过内存查看判断系统大小端
? set var i = 1
? print /a &var
? x /4bx a地址
? x /1bx a地址 看看是不是1
9. 函数 栈相关的操作
1. 查看函数调用顺序 (就可以查看sp 和 bp 看看保存上一个栈帧这种验证了哇)
? 函数调用栈顺序
? backtrace
2. 切换到栈编号为N的上下文中
? frame N
3. 查看当前函数调用的栈信息
? info frame
10. info 深入
-
查看当前寄存器的值
info registers
- 查看当前函数参数的值
info args
- 查看当前局部变量的值
info locals
- 查看当前栈帧的的详细信息
info frame
- 查看程序中的变量符号
info variables
- 查看程序中的函数名称
info functions
11. 有用的调试技巧
-
断点处自动打印
display /f expression
undisplay
- 查看程序中的符号
whatis
ptype 会把符号怎么定义的也显示,whatis不会
- 代码查看
list 默认显示10
list 行号:将显示当前文件以“行号”为中心的前后10行代码,如:list 12
list 函数名:将显示“函数名”所在函数的源代码,如:list main
- shell操作
shell