memory - 如何实现/设置数据断点?

标签 memory x86 operating-system interrupt watchpoint

<分区>

要求:

当内存位置发生变化或被写入时,我需要生成一个中断。从 ISR,我可以触发蓝屏,这会给我一个带有方法名称的漂亮堆栈跟踪。

方法:

  • 测试定时器 ISR 中的值。显然,这不会产生令人满意的结果。
  • 我发现了 bochs虚拟机。它有一个基本的内置调试器,可以设置数据断点并停止程序。但我当时似乎无法产生中断。
  • bochs 允许将 gdb 连接到它。不过,我无法使用 gdb 支持来构建它。

其他想法:

  • 一种“预览指令”中断,在执行每条指令之前触发。使用的内存写入指令集应该很容易管理,但我认为提取地址仍然是一个 PITA。而且我认为没有这样的中断。
  • 一种“预览内存访问”中断。同样,我认为它不在那里。
  • 滥用寻呼。将感兴趣的页面标记为不存在并测试页面错误处理程序中的地址。人们仍然需要区分读取和写入操作,我认为页面错误处理程序不知道确切的地址,只知道页码。

最佳答案

参见英特尔 Software Developer's Manual Volume 3A 中的第 16 章.它提供了有关使用调试寄存器的信息,这些寄存器支持在访问特定地址时导致调试器异常等。中断将在导致它的指令之后被触发。具体来说,您必须将 dr0-dr3 之一设置为您要监视的地址,并将 dr7 设置为具有适当值的值以告诉处理器什么类型的访问应该导致中断。

关于memory - 如何实现/设置数据断点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5924785/

相关文章:

operating-system - 是否可以在 vala 中编写系统级代码

string - 为什么我们不能一次性可靠地测试回文

performance - vgetmantps 与 andpd 获取 float 尾数的说明

c - n-pipeline 最终产生 EOF

x86 - 将 PE 加载到内存中进行仿真

x86 - 我如何加载所有 1's into a mmx register? Why doesn' t 这个工作?

linux - 通俗地说,Mac OS、Ubuntu、Linux、Unix有什么区别?

c++ - 如何正确释放 BitStreamFilter (bsf) 而不会出现双重释放错误?

php - 为什么 debug_backtrace() 使用这么多内存?

memory - 神经网络/机器学习内存存储