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

时间:2011-05-07 23:56:03

标签: memory operating-system x86 kernel interrupt

要求:

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

的方法:

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

其他想法:

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

1 个答案:

答案 0 :(得分:6)

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