debugging - 如何在寄存器中设置 GDB 读取观察点?
问题描述
我正在尝试在寄存器中设置读取观察点。通过阅读用户手册。我了解如何在寄存器中设置观察点
watch [-l|-location] expr [thread thread-id] [mask maskvalue]
为表达式设置观察点。当程序写入表达式 expr 并且其值发生变化时,GDB 将中断。
例如:watch $r1
。这意味着当程序写入寄存器 r1 并且其值发生变化时,GDB 将中断。有用!
但是当我使用: 时rwatch $r1
,gdb 的回复是"Expression cannot be implemented with read/access watchpoint."
所以我想知道如何在寄存器中设置读取观察点。或者当程序读取寄存器时有什么方法可以中断?
非常感谢!
解决方案
所以我想知道如何在寄存器中设置读取观察点
我不相信 GDB 提供了这样做的任何便利。
当您在内存位置设置观察点时,GDB 可以在提供特殊调试寄存器(例如x86_64
)的平台上非常有效地实现它。然后程序全速运行,直到访问该位置。
在不提供调试寄存器的平台上,GDB 必须单步执行程序,并将该位置的值与之前记录的值进行比较。这非常慢(但有时很有用),并且出于明显的原因只能用于写入观察点。
由于寄存器没有“位置”,当您在寄存器上设置观察点时,GDB 执行相同的“单步并与先前值比较”的舞蹈。并且读取观察点根本无法工作。
您所要求的可以在 GDB 中实现:单步检查每条指令——它是否访问命名寄存器?
但是这个需求非常少,实现的复杂度也很高,所以我认为没有人愿意实际实现这个。
推荐阅读
- python - 将补充参数传递给 hyperopt 目标函数
- typescript - 如何在索引类型中使用智能感知维护属性访问
- php - Laravel 查询生成器多选和命名列
- excel - 在字符串上使用 Right 函数时出现“编译错误:预期的数组”
- ios - Alamofire如何设置超时
- mysql - 如何删除mysql内部连接中的重复行
- reactjs - 创建 React App 单元测试不会在 VMWare Horizon Client 中执行
- c# - 如何在安装 Outlook 加载项时询问用户权限?
- c# - 如何将最大化的表单移动到另一个屏幕?
- vue.js - Vue CLI 3 使用波浪号“~”构建输出文件