【问题标题】:Tracing memory allocation跟踪内存分配
【发布时间】:2012-05-09 11:26:37
【问题描述】:

是否有任何方法可以跟踪 C 程序的每个步骤分配、重新分配和释放了多少内存?我的意思是程序中的所有分配步骤,而不是错误、内存泄漏或类似的东西。

【问题讨论】:

标签: c memory-management


【解决方案1】:

一种常见的方法是使用宏覆盖 malloc/free:

#define malloc(size) custom_malloc(size, __FILE__, __LINE__)

然后,您可以让 custom_malloc 执行正常的 malloc,并将分配信息转储到文件(或您想要对其执行的任何操作)。

要跟踪空闲时释放了多少内存,一种选择是在每次 malloc 调用时分配一个额外的字段来存储分配的大小,然后您可以在空闲时检查它。 或者您可以将 malloc/free 指针转储到文件,然后编写脚本进行后处理并将它们排列起来。这在一定程度上取决于您要如何处理这些信息。

【讨论】:

    【解决方案2】:

    在 MFC 环境中的窗口上 DEBUG_NEW 是一种方法。

    http://msdn.microsoft.com/en-us/library/aa297313%28v=vs.60%29.aspx

    另一个是使用标准文件和行号重新定义 alloc 系列函数。

       #define malloc(size) custom_malloc(size, __FILE__, __LINE__)
    

    详细示例位于 http://www.almostinfinite.com/memtrack.html

    【讨论】:

      【解决方案3】:

      是的,有办法做到这一点。我只知道一种方法。它称为Pin。理想情况下,您可以将pin tool 附加到二进制文件,然后它将可以访问所有内存访问和内容。它不需要对源代码进行任何修改。

      这将需要您进行一些编程来编写 Pin 工具。 pin 工具本质上是代码,您可以在其中指定要在程序运行中监控哪些参数以及如何监控。它非常灵活。但请注意,它有一点学习曲线。因此,只有当您有时间学习它时,这才是理想的。但是,如果你立竿见影,它可能不足以满足你的目的。

      另请注意,Pin 默认提供了一些您可能感兴趣的工具,或者您可以根据自己的需要进行修改。您可能想要查看的一些工具(在我的脑海中)是: 1. 皮那特瑞斯 1.MallocTrace

      我可能拼错了什么。但是有很多东西可以满足您的需求!

      另一种可行的解决方案是@happydave 提到的解决方案,我不推荐的解决方案是重新定义mallocfree 函数,以便在调用malloc/free 时记录参数你感兴趣的。我推荐 Pin 而不是重新定义 malloc 的唯一原因是当你有时间并且将来你希望为你的跟踪器添加更多功能时。

      【讨论】:

      • 不要忘记并非所有东西都在 Intel(R) 二进制文件上运行...重新定义 malloc 等是获得基本跟踪水平的合理方法,虽然它可能值得使用第三个-党库,有时可以通过重新定义的方法得到一个快速的答案。
      • 我需要它只是因为我们的下一个考试要求以不分配过多内存的方式实现程序,并且每次重新分配只允许 80 字节。当然我知道它效率太低,但这只是为了考试。无论如何,谢谢,我认为宏定义成功了:)
      • @GwynEvans 同意。现在我觉得那个人要了一根针,我给了他一把剑:P。 kudayar-pirimbaev 只是对 PIN 的另一个澄清。我认为,据我所知,它也适用于 AMD 而不是 PPC。只是为了事先检查您是否打算将来玩它
      猜你喜欢
      • 2010-10-28
      • 2012-12-16
      • 2012-06-10
      • 1970-01-01
      • 2022-09-27
      • 2011-01-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多