Linux下gdb调试-设置观察点说明一

一.  gdb 调试中设置观察点介绍

gdb 调试时,有时需要监测某个变量或表达式的值。通过值的变化情况判断程序的执行过程是否存在异常或者 Bug

设置观察的方法,可以监控程序中某个变量或者表达式的值,只要发生改变,程序就会停止执行。

设置观察点的命令包括如下:

1. watch 命令:设置观察点

2. rwatch 命令:设置读观察点

3. awatch 命令:设置读写观察点

二. 设置观察点的注意点

gdb 调试中,调试 C/C++ 代码设置观察点时,有下面几点需要注意:

1. 当监控的变量(表达式)为局部变量(表达式)时,一旦局部变量(表达式)失效,则监控操作也随即失效;

2. 如果监控的是一个指针变量(例如 *p),watch *p 命令 watch p 命令是有区别的。

watch *p 命令监控的是 p 所指数据的变化情况, watch p 命令监控的是 p 指针本身有没有改变指向;

3. 设置观察点还可以用于监控数组中元素值的变化情况。

例如对于 a[10] 数组,watch a 命令表示:只要 a 数组中存储的数据发生改变,程序就会停止执行。

三. watch 设置观察点的方式

gdb 调试中,watch 命令 设置监控变量(或表达式值)的方式分两种:设置硬件观察点 与 设置软件观察点。

1. 设置软件观察点

所谓软件观点(software watchpoint),用 watch 命令监控目标变量(表达式)后,gdb 调试器会以单步执行的方式运行程序,并且每行代码执行完后,都会检测该目标变量(或表达式值)的值是否发生改变,如果改变则程序执行停止。

设置软件观察点,这种“实时”的判别方式,一定程度上会影响程序的执行效率。但从另一个角度看,调试程序的目的并非是为了获得运行结果,而是查找导致程序异常或 Bug 的代码,因此即便软件观察点会影响执行效率,一定程度上也是可以接受的。

2. 设置硬件观察点

硬件观察点(Hardware watchpoint),它在实现监控机制的同时不影响程序的执行效率。

简单的理解就是,系统会为 gdb 调试器提供少量的寄存器(例如,32 位的 Intel x86 处理器提供有 4 个调试寄存器),每个寄存器都可以作为一个观察点协助 gdb 调试器完成监控任务。

设置硬件观察点的方式需要注意

基于寄存器个数的限制,如果调试环境中设立的硬件观察点太多,则有些可能会失去作用,这种情况下,gdb 调试器会发出如下警告:

Hardware watchpoint num: Could not insert watchpoint

除此之外,受到寄存器数量的限制,可能会出现:无法使用硬件观察点监控数据类型占用字节数较多的变量(表达式)。

例如,某些操作系统中,gdb 调试器最多只能监控 4 个字节长度的数据,这意味着 C/C++代码中 double 类型的数据是无法使用硬件观察点监测的。这种情况下,可以考虑将其换成占用字符串少的 float 类型。

目前,大多数 PowerPC 或者基于 x86 的操作系统,都支持采用硬件观点。并且 gdb 调试器在建立观察断点时,会优先尝试建立硬件观察点,只有当前环境不支持硬件观察点时,才会建立软件观察点。借助如下指令,即可强制 gdb 调试器只建立软件观察点:

set can-use-hw-watchpoints 0

注意,set can-use-hw-watchpoints 0 命令的效用范围:在执行此命令之前建立的硬件观察点,不会受此命令的影响。

注意,awatch 和 rwatch 命令只能设置硬件观察点。

如果系统不支持或者借助如上命令禁用,则 gdb 调试器会打印如下信息:

Expression cannot be implemented with read/access watchpoint.

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值