十一、调试利器 GDB (上)
1. 初始 GDB
- 什么是GDB ?
- GNU项目中的调试器(gnu debuger)
- 能够跟踪程序的执行,也能够恢复程序崩溃前的状态
- 为什么需要GDB ?
- 软件不是一次性开发完成的(是软件就有bug,是程序就有问题)
- 调试是软件开发过程中不可或缺的技术(调试工具很重要)
2. GDB的常规应用
- 自定义程序的启动方式(指定影响程序运行的参数)
- 设置条件断点(在条件满足时暂停程序的执行)
- 回溯检查导致程序异常结束的原因(Core Dump)
- 动态改变程序执行流(定位问题的辅助方式)
3. GDB的启动方式
- 直接启动
- gdb
- gdb test.out
- gdb test.out core(程序崩溃时产生的core)
- 动态连接
- gdb test.out pid(进程id)
4. GDB应用示例一
5. GDB应用示例二
6. 编程实验:GDB使用初探
ulimit -c unlimited 程序崩溃时,产生core文件。
gdb test.out core
file test.out
set args D.T.Software
run
ps aux
7. 使用GDB进行断点调试
- 断点类型
- 软件断点:由非法指令异常实现(软件实现)
- 硬件断点:由硬件特性实现(数量有限)
- 数据断点:由硬件特性实现(数量有限)
8. 软件断点的相关操作
- tbreak 一次性断点
- break 永久断点
- [] 条件断点 条件成立时,才会断住
- 通过函数名设置断点
- 通过文件名行号设置断点
9. 调试时的常用操作
run 运行程序
start 运行后暂停
10. 硬件断点及其应用
- 当代码位于只读存储器(Flash)时,只能通过硬件断点调试
- 硬件断点需要硬件支持,数量有限
- GDB中通过hbreak命令支持硬件断点
- hbreak 与break使用方式完全一致
11. 编程实验:使用GDB进行断点调试
12. 小结
- GDB是GNU项目中的调试器,能够跟踪或改变程序的执行
- GDB能够根据Core Dump回溯检查导致程序异常结束的原因
- GDB同时支持软件断点,硬件断点和数据断点
- GDB是嵌入式开发中必须掌握的重要工具
十二、调试利器 GDB (下)
1. 数据断点
- GDB中支持数据断点的设置
- watch命令用于监视变量是否被改变(本质为硬件断点)
- watch 命令的用法︰ watch var_name
2. GDB中的内存查看
- GDB中可以检查任意内存区域中的数据
- 命令语法:x / Nuf expression
- N 需要打印的单元数
- u 每个单元的大小
- f 数据打印的格式
- 示例:x /4bx 0x804a024
3. x 命令中参数 u 对应的单位
4. GDB中的打印格式
5. 示例:判断系统大小端
6. 编程实验:变量断点和内存查看
watch.c
7. 函数调用栈的查看( backtrace 和 frame )
- backtrace
- 查看函数调用的顺序(函数调用栈的信息)
- frame N
- 切换到栈编号为N的上下文中
- info frame
- 查看当前函数调用的栈帧信息
8. 什么是栈帧信息?
9. 深入info命令
10. 编程实验:函数调用栈的查看
frame.c
sp和bp在栈上保存
11. 一些调试中的小技巧
12. 技巧示例:断点处自动打印
13. 技巧示例:符号查看
14. 编程实验:调试中的小技巧
tricks.c
15. 小结
- GDB支持数据断点的设置(一种类型的硬件断点)
- watch用于监视变量是否被改变,x用于查看内存中的数据
- GDB支持函数调用栈的查看(backtrace, info frames)
- GDB支持运行时对程序中的符号进行查看(whatis, ptype)