【发布时间】:2010-04-17 19:18:34
【问题描述】:
有没有一种方法可以让我通过一段特定的代码(一个函数或一行代码)找出对内存的所有更改,而无需事先知道我期望更改的位置(我想查看整个程序内存空间) ?在 gdb 中观看需要我知道我期望发生的变化...
【问题讨论】:
-
这是因为您认为该函数可能会破坏内存吗?
-
没错。另外,它是一个库函数,我不想看到它的代码。
有没有一种方法可以让我通过一段特定的代码(一个函数或一行代码)找出对内存的所有更改,而无需事先知道我期望更改的位置(我想查看整个程序内存空间) ?在 gdb 中观看需要我知道我期望发生的变化...
【问题讨论】:
如果您可以在 Linux 或 Mac OS 上运行您希望探测的软件,我建议您查看 Valgrind,特别是 Valgrind 的 Memcheck 工具。
简而言之,Valgrind 在“合成 CPU”上运行您的程序。它不会直接在真实硬件上执行程序代码。因此,它能够检测程序所做的一切。 Memcheck 工具能够监视程序的所有内存访问。它在帮助查找各种类型的内存错误方面做得非常惊人。
【讨论】:
嗯,您可以使用多种调试技术来监控 C 应用程序中的内存分配。例如,这里有一些用于 Linux 的 options。
【讨论】:
如果您想捕获对特定内存页面的所有访问,您可能会发现mprotect 很方便。但是你想根据指令地址而不是目标地址来限制你的监控。
有几种方法,它们都需要在源代码中识别指针的使用。除非您打算在不同的功能上频繁执行此操作,否则手动执行此操作可能更容易。
一种方法是找到执行间接内存访问的指令并设置条件断点(即,如果指针位于您希望更改的缓冲区之外,则中断)。
另一种方法是修补功能代码以插入代码以测试或打印所有正在使用的指针。
另一种方法是将功能代码标记为不可执行(例如使用 mprotect)。然后将运行您的信号处理程序(分段错误)而不是函数。然后可以使用 VM 技术来解释代码,而不是直接在硬件上执行。
最后一种技术是最通用的方法,如果您只想在单个函数中跟踪内存访问,第一种技术将是最少的工作量,第二种技术可能是工作量最大但性能影响最小的技术.
【讨论】:
不在软件中,因为软件本身在您尝试监控的内存中执行。 GDB 使用的片上调试硬件没有足够的资源来实现您所追求的。从技术上讲,我认为可以虚拟化一个进程使用的所有内存,并让一个单独的处理程序执行监视器,但我建议这是相当先进的,而不是您可以轻松实现的东西。
使用外部硬件(例如逻辑分析仪)是可能的,但探测地址和数据总线是不切实际的,除非电路板专门构造允许这样做。
最后,按照你的建议去做可能是不切实际的,但我想知道你为什么需要这样的功能?
【讨论】: