2012-05-22 75 views
3

我想问问,如果有人有任何想法如何检测写入分配内存地址。内存块C写入/读取检测

起初我使用mprotect和sigaction一起进行写/读操作时强制出现分段错误。

用在几个这种方法

两个负面因素:

  • 是很难通过分段故障
  • 在mprotect的内存地址传递必须对齐到一个页面边界,即它无法处理这个内存地址用一个简单的malloc。

为了阐明问题:

我构建的应用程序中下集群环境。在某些时候,我分配内存,我在本地主机调用缓冲区并分配一些数据。该缓冲区将被发送到远程节点并具有相同的过程。在同一点上,这个缓冲区将在远程节点中被写入/读取,但是我不知道什么时候(它将被用于DMA写入/读取缓冲区),必须通知本地主机关于缓冲区修改。就像我上面说过的,我已经使用了一些机制,但其中没有一个能够以其能力处理它。现在我只想要一些想法。

每个不同的想法在这里受到欢迎。

谢谢

回答

1

您可以使用硬件断点。缺点是这是硬件特定的,只能设置有限数量的断点。此外,大多数情况下这些设施并非特定于任务,所以如果您运行该程序的多个实例,他们将共享可用'插槽'的数量。

x86架构具有可用于设置硬件内存断点的调试寄存器(请参阅:http://en.wikipedia.org/wiki/X86_debug_register)。

如果你想测试这个,你可以使用GDB设置硬件断点。您可以使用GDB的'watch'命令将硬件内存断点放在变量上。

请注意,使用调试寄存器和mprotect()只是完成您所要求的工作的方法,我不认为它们是进行内存管理(您可能试图在此执行的操作)的良好工程实践。也许你可以解释一下更多关于你想要在更高层次上做什么:http://catb.org/esr/faqs/smart-questions.html#goal

+0

感谢您的建议。也许我没有表达得很好,但这里的想法并不是调查什么可能是错误的特定内存块,但是是捕获一个内存地址的时候执行读/写操作在这个内存地址和处理它像一个事件。这个所有操作中最重要的事情必须是执行时间。 – Majao

+0

@Majao:我想我确实了解你。应该可以从应用程序本身设置调试寄存器,正如我写的那样,有一些缺点。我认为针对您的问题(检测特定内存访问)的唯一解决方案是硬件设施,并且超出页面级访问限制,X86调试寄存器是您唯一的选择。 – Bart