试图在Linux机器上捕获所有内存读/写

时间:2013-10-18 19:11:05

标签: linux unix memory

我有一台Linux机器,我试图在特定的时间内捕获所有写入或读取内存(我基本上需要字节地址和正在写入的值)。是否有任何工具可以帮助我做到这一点,还是我必须更改操作系统代码?

4 个答案:

答案 0 :(得分:2)

您提到您只想监视对某个物理内存地址的内存读取和写入。我假设当你说内存读/写时,你指的是一个汇编指令,它将数据读/写到内存而不是取指令。

您必须修改内核中的某些分页代码,以便在访问某个地址范围时出现页面错误。然后,在页面错误处理程序中,您可以以某种方式记录访问。您可以通过解码导致故障的指令并从寄存器中读取数据来提取目标地址和数据。记录后,页面配置为不发生故障并重新尝试该指令。与写时复制技术类似,但您将每个读/写记录到该区域。

另一种硬件方法是以某种方式安装总线嗅探器或点击平台上的硬件调试接口,以监视正在访问哪些内存区域,但我想你会遇到使用此方法的缓存问题。

如另一张海报所述,您还可以修改模拟器以捕获某些内存访问并在其上运行代码。

我认为这两种方法都是特定于平台的,需要付出很多努力。出于好奇,你希望实现什么?必须有一种更好的解决方法,而不是监视对物理内存的访问。

答案 1 :(得分:1)

自我内省适用于某些类型的调试。有关内存访问的完整跟踪,则不是。调试代码如何在不执行更多内存访问的情况下存储跟踪?

如果你想留在软件中,最好的办法是运行在模拟器中跟踪的代码。不是使用MMU隔离测试代码同时仍提供直接访问的虚拟机,而是完整的仿真器。 x86和你会关心的大多数其他架构都存在很多。

答案 2 :(得分:1)

好吧,如果你只对特定进程的内存读写感兴趣(对该进程的部分/全部虚拟内存空间),你可以使用ptrace和mprotect的组合(mprotect使内存无法访问)并且ptrace运行直到它访问内存然后单步执行。

答案 3 :(得分:0)

很抱歉,即使您更改操作系统代码,也无法按照自己的意愿行事。对内存的读取和写入不会通过OS系统调用。

您可以获得的最接近的是对感兴趣的变量使用访问器函数。可以检测访问器以将跟踪信息放在单独的缓冲区中。嵌入式调试通常会这样做以获取I / O寄存器访问的日志。