Memory 如何实现/设置数据断点? 要求:

Memory 如何实现/设置数据断点? 要求:,memory,x86,operating-system,interrupt,watchpoint,Memory,X86,Operating System,Interrupt,Watchpoint,当内存位置改变或写入时,我需要生成一个中断。从ISR中,我可以触发一个蓝屏,该蓝屏为我提供了一个很好的带有方法名的堆栈跟踪 方法: 测试计时器ISR中的值。显然,这并不能给出令人满意的结果 我发现了虚拟机。它有一个基本的内置调试器,可以设置数据断点并停止程序。但我似乎无法在那一点上产生中断 bochs允许将gdb连接到它。不过,我还不能用gdb支持来构建它 其他想法: 一种“预览指令”中断,在执行之前触发每条指令。这组使用过的内存写入指令应该是相当容易管理的,但我认为提取地址仍然是一个PI

当内存位置改变或写入时,我需要生成一个中断。从ISR中,我可以触发一个蓝屏,该蓝屏为我提供了一个很好的带有方法名的堆栈跟踪

方法:
  • 测试计时器ISR中的值。显然,这并不能给出令人满意的结果
  • 我发现了虚拟机。它有一个基本的内置调试器,可以设置数据断点并停止程序。但我似乎无法在那一点上产生中断
  • bochs允许将gdb连接到它。不过,我还不能用gdb支持来构建它
其他想法:
  • 一种“预览指令”中断,在执行之前触发每条指令。这组使用过的内存写入指令应该是相当容易管理的,但我认为提取地址仍然是一个PITA。我认为没有这种干扰
  • 一种“预览内存访问”中断。再说一次,我认为它不在那里
  • 滥用寻呼。将感兴趣的页面标记为不存在,并在页面错误处理程序中测试地址。我们仍然需要区分读操作和写操作,我认为,页面错误处理程序不知道确切的地址,只知道页码

参见英特尔手册第16章。它提供了有关使用调试寄存器的信息,这些寄存器支持在访问特定地址时引发调试器异常。中断将在导致中断的指令之后触发。具体来说,您必须将dr0-dr3中的一个设置为您想要查看的地址,并将dr7设置为具有适当值的地址,以告诉处理器哪些类型的访问会导致中断。

好的,这正是我所要寻找的。谢谢我现在用
0x0000003
设置了
DR7
,用地址设置了
DR0
。这应该是一个单字节长度的数据断点,但不会触发。
DR0
所指的值发生更改。我必须启用什么吗?@kiw由于DR7的第16位和第17位是0,所以您有一个执行断点。您希望将位16设置为只写断点,因此DR7应该是
0x00010303
。。。该死的运算符优先级<代码>(答案是指向不再包含相关信息的文件的链接,这很可能在该文档的第2部分中。(它在索引中,但本文档在第13章结束,远远早于现在的第17章。)