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 命令,即当发生读取变量或改变变量值的行为时,程序就会暂停住。

总结

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

相关文章

  • Linux系统cpu飙高的排查方法

    Linux系统cpu飙高的排查方法

    本文介绍了如何在Linux系统中通过检查CPU使用率、系统负载、进程资源、系统调用、日志分析以及使用性能工具如perf来诊断CPU占用过高的问题,帮助用户定位和解决问题,需要的朋友可以参考下
    2024-10-10
  • Linux实现用脚本添加crontab定时任务

    Linux实现用脚本添加crontab定时任务

    这篇文章主要介绍了Linux实现用脚本添加crontab定时任务方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-06-06
  • Ubuntu LTS服务器部署Jenkins详细介绍

    Ubuntu LTS服务器部署Jenkins详细介绍

    这篇文章主要介绍了Ubuntu LTS服务器部署Jenkins详细介绍的相关资料,需要的朋友可以参考下
    2017-03-03
  • Ubuntu修改IP的三种方法

    Ubuntu修改IP的三种方法

    在 Ubuntu 系统中配置或修改静态 IP 地址,主要依赖于系统的版本以及是否使用图形界面,本文给大家介绍了Ubuntu修改IP的三种常用方法,并通过代码示例讲解的非常详细,需要的朋友可以参考下
    2025-06-06
  • Linux系统重启后MySQL数据丢失问题的解决步骤

    Linux系统重启后MySQL数据丢失问题的解决步骤

    今天分享一个在Linux系统中经常遇到的问题:系统重启后发现MySQL无法启动,而且数据似乎丢失了,这个问题可能会让人惊慌失措,但别担心,通常情况下这只是因为数据盘没有正确挂载导致的,现在我们将深入探讨这个问题的原因、解决方法以及如何预防它的再次发生
    2024-09-09
  • linux下用户程序同内核通信详解(netlink机制)

    linux下用户程序同内核通信详解(netlink机制)

    这篇文章主要介绍了linux下用户程序同内核通信详解(netlink机制),涉及netlink,内核模块,用户程序的介绍等相关内容,小编觉得还是挺不错的,这里分享给大家,需要的朋友可以参考下
    2018-01-01
  • PHP程序员玩转Linux系列 Linux和Windows安装nginx

    PHP程序员玩转Linux系列 Linux和Windows安装nginx

    这篇文章主要为大家详细介绍了PHP程序员玩转Linux系列文章,Linux和Windows安装nginx教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-04-04
  • 详解firewall的规则设置与命令(白名单设置)

    详解firewall的规则设置与命令(白名单设置)

    这篇文章主要介绍了详解firewall的规则设置与命令(白名单设置),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-11-11
  • Linux中让alias设置永久生效的方法详解

    Linux中让alias设置永久生效的方法详解

    在Linux中为我们提供了一个很方便的重命名命令 alias ,它的作用为如果要执行命令太长又不符合用户的习惯,那么我们可以为它指定一个别名。下面这篇文章主要给大家介绍了关于Linux中让alias设置永久生效的相关资料,需要的朋友可以参考下。
    2017-12-12
  • Linux无法为立即文档创建临时文件:设备上没有空间的问题解决

    Linux无法为立即文档创建临时文件:设备上没有空间的问题解决

    这篇文章主要介绍了Linux无法为立即文档创建临时文件的问题解决方案,文中通过图文结合的形式讲解的非常详细,具有一定的参考价值,需要的朋友可以参考下
    2024-10-10

最新评论