【发布时间】:2012-05-09 11:26:37
【问题描述】:
是否有任何方法可以跟踪 C 程序的每个步骤分配、重新分配和释放了多少内存?我的意思是程序中的所有分配步骤,而不是错误、内存泄漏或类似的东西。
【问题讨论】:
标签: c memory-management
是否有任何方法可以跟踪 C 程序的每个步骤分配、重新分配和释放了多少内存?我的意思是程序中的所有分配步骤,而不是错误、内存泄漏或类似的东西。
【问题讨论】:
标签: c memory-management
一种常见的方法是使用宏覆盖 malloc/free:
#define malloc(size) custom_malloc(size, __FILE__, __LINE__)
然后,您可以让 custom_malloc 执行正常的 malloc,并将分配信息转储到文件(或您想要对其执行的任何操作)。
要跟踪空闲时释放了多少内存,一种选择是在每次 malloc 调用时分配一个额外的字段来存储分配的大小,然后您可以在空闲时检查它。 或者您可以将 malloc/free 指针转储到文件,然后编写脚本进行后处理并将它们排列起来。这在一定程度上取决于您要如何处理这些信息。
【讨论】:
在 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__)
【讨论】:
是的,有办法做到这一点。我只知道一种方法。它称为Pin。理想情况下,您可以将pin tool 附加到二进制文件,然后它将可以访问所有内存访问和内容。它不需要对源代码进行任何修改。
这将需要您进行一些编程来编写 Pin 工具。 pin 工具本质上是代码,您可以在其中指定要在程序运行中监控哪些参数以及如何监控。它非常灵活。但请注意,它有一点学习曲线。因此,只有当您有时间学习它时,这才是理想的。但是,如果你立竿见影,它可能不足以满足你的目的。
另请注意,Pin 默认提供了一些您可能感兴趣的工具,或者您可以根据自己的需要进行修改。您可能想要查看的一些工具(在我的脑海中)是:
1. 皮那特瑞斯
1.MallocTrace
我可能拼错了什么。但是有很多东西可以满足您的需求!
另一种可行的解决方案是@happydave 提到的解决方案,我不推荐的解决方案是重新定义malloc 和free 函数,以便在调用malloc/free 时记录参数你感兴趣的。我推荐 Pin 而不是重新定义 malloc 的唯一原因是当你有时间并且将来你希望为你的跟踪器添加更多功能时。
【讨论】: