我有一台 Linux 机器,我试图在特定时间内捕获所有对内存的写入或读取(我基本上需要字节地址和正在写入的值)。有什么工具可以帮助我做到这一点,还是我必须更改操作系统代码?
4 回答
您提到您只想监视对某个物理内存地址的内存读取和写入。我将假设当您说内存读/写时,您的意思是一条汇编指令,它将数据读/写到内存而不是指令获取。
您必须修改内核中的一些分页代码,以便在访问某个地址范围时出现分页错误。然后,在页面错误处理程序中,您可以以某种方式记录访问。您可以通过解码导致故障的指令并从寄存器中读取数据来提取目标地址和数据。记录后,页面被配置为不出错并重新尝试指令。类似于写时复制技术,但您将每次读/写记录到该区域。
另一种硬件方法是以某种方式安装总线嗅探器或利用平台上的硬件调试接口来监控正在访问哪些内存区域,但我想你会在使用这种方法的缓存方面遇到问题。
正如另一张海报所提到的,您还可以修改模拟器以捕获某些内存访问并在其上运行您的代码。
我想说这两种方法都非常特定于平台,并且需要付出很多努力。出于好奇,您希望实现什么目标?必须有比监控对物理内存的访问更好的方法来解决它。
自省适用于某些类型的调试。对于内存访问的完整跟踪,它不是。调试代码应该如何在不执行更多内存访问的情况下存储跟踪?
如果你想留在软件中,最好的办法是在模拟器中运行被跟踪的代码。不是使用 MMU 隔离测试代码同时仍提供直接访问的虚拟机,而是一个完整的模拟器。x86 和您关心的大多数其他架构都有很多。
好吧,如果您只对特定进程的内存读取和写入感兴趣(对该进程的部分/全部虚拟内存空间),您可以使用 ptrace 和 mprotect 的组合(mprotect 使内存不可访问并 ptrace 运行直到它访问内存然后单步)。
很抱歉,即使您更改操作系统代码,也不可能做您想做的事。对内存的读取和写入不通过 OS 系统调用。
您可以获得的最接近的方法是对感兴趣的变量使用访问器函数。可以检测访问器以将跟踪信息放在单独的缓冲区中。嵌入式调试通常这样做是为了获取 I/O 寄存器访问的日志。