Linux调试私房菜(五)调试利器 GDB

十一、调试利器 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)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值