gdb调试中设置监控点watch,rwatch,awatch的区别及说明

 更新时间:2023年09月04日 10:16:49   作者:凌肖战  
这篇文章主要介绍了gdb调试中设置监控点watch,rwatch,awatch的区别及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

一. watch 命令的两种监控机制

在 gdb 调试中,

watch 命令有两种设置观察点的方式:

  • 硬件观察点
  • 软件观察点

注意:

而 awatch 和 rwatch 命令只能设置硬件观察点。

watch 命令所支持的两种设置机制 

软件观察点:

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

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

硬件观察点:

所谓硬件观察点(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

注意,在执行此命令之前建立的硬件观察点,不会受此命令的影响。

awatch 命令和 rwatch 命令只能设置硬件观察点,如果系统不支持或者借助如上命令禁用,

则 GDB 调试器会打印如下信息:

Expression cannot be implemented with read/access watchpoint.

二. watch 命令,rwatch 命令,awatch 命令的区别

1.  watch 命令可以设置硬件观察点方式或软件观察点的方式。而 rwatch 命令与 awatch 命令只能设置硬件观察点的方式。

2. 每个命令的功能不同。

  • watch 命令,即变量(或表达式)的值改变,程序都会停下来。
  • rwatch 命令,即当发生读取变量行为时,程序就会暂停住。
  • awatch 命令,即当发生读取变量或改变变量值的行为时,程序就会暂停住。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • LVS+Keepalived构建高可用负载均衡配置方法(配置篇)

    LVS+Keepalived构建高可用负载均衡配置方法(配置篇)

    这篇文章主要介绍了LVS+Keepalived构建高可用负载均衡配置方法,需要的朋友可以参考下
    2013-06-06
  • 阿里云linux服务器安全设置(防火墙策略等)

    阿里云linux服务器安全设置(防火墙策略等)

    这篇文章主要介绍了阿里云linux服务器安全设置,主要是针对防火墙策略等一些补充
    2016-10-10
  • Ubuntu 16.04与Apache虚拟主机配置的步骤详解

    Ubuntu 16.04与Apache虚拟主机配置的步骤详解

    这篇文章主要给大家介绍了关于Ubuntu 16.04与Apache虚拟主机配置的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用ubuntu16.04系统具有一定的参考学习价值,需要的朋友们来一起看看吧。
    2018-04-04
  • 用DNSPod和Squid打造自己的CDN (六) 编译并安装Squid

    用DNSPod和Squid打造自己的CDN (六) 编译并安装Squid

    这篇文章主要介绍centos下编译并安装Squid的方法,需要的朋友可以参考下
    2013-04-04
  • ubuntu16.04 升级内核的方法步骤

    ubuntu16.04 升级内核的方法步骤

    这篇文章主要介绍了ubuntu16.04 升级内核的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-08-08
  • 使用ssh-keygen,实现免密码登陆linux的方法

    使用ssh-keygen,实现免密码登陆linux的方法

    下面小编就为大家带来一篇使用ssh-keygen,实现免密码登陆linux的方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-11-11
  • Linux中的进程状态和优先级

    Linux中的进程状态和优先级

    这篇文章主要介绍了Linux中的进程状态和优先级方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-09-09
  • Linux上也有10个流行的Windows应用程序

    Linux上也有10个流行的Windows应用程序

    今天小编就为大家分享一篇关于在linux上也流行的windows程序,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-09-09
  • Centos7.2安装Nginx实现负载平衡的方法

    Centos7.2安装Nginx实现负载平衡的方法

    这篇文章主要介绍了Centos7.2安装Nginx实现负载平衡的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-01-01
  • 浅谈Linux信号机制

    浅谈Linux信号机制

    信号是进程间通信机制中唯一的异步通信机制,一个进程不必通过任何操作来等待信号的到达,事实上,进程也不知道信号到底什么时候到达。进程之间可以互相通过系统调用kill发送软中断信号。内核也可以因为内部事件而给进程发送信号,通知进程发生了某个事件
    2021-06-06

最新评论