1.1 GDB 初识
1.1.1 什么是 GDB?
GDB 是 GNU 项目中的调试器(gnu debuger), 能够跟尊程序的执行, 也能恢复程序崩溃前的状态
1.1.2 为什么需要 GDB?
软件产品的研发过程必然伴随 bug, 调试时软件开发中不可或缺的技术(调试工具很重要)
1.1.3 DBG 与 binutils
1.2 GDB 的常规使用
1. 自定义程序得到启动方式(指定影响程序运行的参数)
2. 设置条件断点(在满足条件时程序暂停执行)
3. 回溯检查导致程序异常结束的原因(core dump)
4. 动态改变程序的执行流(定位问题的辅助方式)
1.3 GDB 的启动方式
? 直接启动:
- gdb
- gdb test.out
- gdb test.out core
? 动态链接
gdb test.out pid
1.4 GDB 的应用示例
示例 1:
- dbg // 启动
- file test.out // 载入目标程序
- set args arg1 arg2 // 设置命令行参数
- run // 执行目标程序
注: gdb + file test.out == gdb test.out
示例 2:
- gdb // 启动
- attach pid // 链接到目标进程, 链接成功后目标程序将停止执行
- continue // 恢复执行
注: gdb + attach pid == gdb test.out pid
1.5 断点调试
1.5.1 断点类型
软件断点: 由非法指令异常实现(软件实现),, 通过中断来实现程序位于 ram 中
硬件断点: 由硬件特性实现 (数量有限) 程序位于 flash(只读)中
数据断点: 由硬件特性实现(数量有限), 监视内存, 当内存被改写时触发
1.5.2 软件断点相关操作
通过函数名设置断点:
- break func_name [ if var = value]
- tbreak func_name [ if var = value]
通过行号设置断点:
- break file_name:line_num [ if var = value ]
- break file_name:line_num [ if var = value ]
Tbreak 设置的断点只生效一次
1.5.3 调试时相关操作
1.5.4 硬件断点及其操作
当代码位于只读寄存器 (flash) 时, 只能通过硬件断点调试
硬件断点需要硬件支持, 数量有限
GDB 通过 hbreak 命令支持硬件断点, 与 break 使用方法完全一致
来源: http://www.bubuko.com/infodetail-2518208.html