检测C中的所有内存更改

时间:2010-04-17 19:18:35

标签: c memory

有没有办法可以通过特定的代码片段(函数或代码行)找出对内存的所有更改,而不事先知道我期望更改的位置(我想看整个程序的内存空间) ?在gdb中观看需要我知道我期待的变化......

4 个答案:

答案 0 :(得分:6)

如果您可以在Linux或Mac OS上运行想要探测的软件,我建议您查看Valgrind,特别是Valgrind的Memcheck工具。

简而言之,Valgrind在“合成CPU”上运行程序。它不直接在真实硬件上执行程序代码。因此,它能够检测程序所做的一切。 Memcheck工具能够监视程序的所有内存访问。它可以帮助找到各种类型的内存错误。

答案 1 :(得分:1)

嗯,您可以使用各种调试技术来监视C应用程序中的内存分配。例如,这里有一些options用于Linux。

答案 2 :(得分:0)

不在软件中,因为软件本身在您尝试监视的内存中执行。 GDB使用的片上调试硬件没有足够的资源来实现您的目标。从技术上讲,我认为可以虚拟化进程使用的所有内存,并且有一个单独的处理程序来执行监视器,但我建议这是相当高级的,而不是你可以轻松实现的东西。

可以使用外部硬件(例如逻辑分析仪),但探测地址和数据总线是不切实际的,除非电路板是专门构建的,以便允许这样做。

最后,做你的建议可能不切实际,但我不得不想知道为什么你需要这样的功能?

答案 3 :(得分:0)

如果您希望捕获对特定内存页面的所有访问权限,您可能会发现mprotect方便。但是您希望根据指令地址限制监控,而不是目标地址。

有几种方法,所有方法都需要在源代码中识别指针使用。除非您打算经常在不同的功能上执行此操作,否则手动操作可能更容易。

一种方法是查找执行间接内存访问和设置条件断点的指令(例如,如果指针位于您希望更改的缓冲区之外,则中断)。

另一种方法是修补功能代码以插入代码来测试或打印正在使用的所有指针。

另一种方法是将功能代码标记为不可执行(例如mprotect)。然后将运行您的信号处理程序(分段错误)而不是函数。然后可以使用VM技术来解释代码,而不是直接在硬件上执行代码。

最后一种技术是最常用的方法,如果你只想在一个函数中跟踪内存访问,第一种技术是最少的努力,第二种技术可能是最多的工作,但也是最小的性能命中