1

我有一个包含所有 c 代码的 MS-Visual Studio 2005 工作区。此应用程序(exe)使用 malloc 和 realloc 从堆中动态分配内存。当我运行特定的测试用例时,我想计算这个应用程序使用 malloc/realloc 在堆上分配的最大大小。

我不想通过记录 malloc 大小并累积它们来更改代码,因为:

a) 可能存在这样一种情况,一些 1KB 的内存被分配,然后被释放,然后 2KB 的内存被分配。所以最大值是 2KB,我需要将其作为值而不是 1+2=3KB。

因此,我必须真正查看此代码中发生的所有 malloc/free 并为此添加代码,这是我想避免的。

1) 那么是否有任何工具(免费软件/许可)来查找使用 malloc/realloc 动态分配的最大或总内存的大小?

2) MS Visual Studio 2005/2008 本身是否提供任何此类功能?

谢谢,

-广告

4

4 回答 4

1

如果您与 CRT 进行静态链接,则可以“否决” malloc、realloc、free 的实现(实际上,所有出现在 CRT 中 malloc.c、realloc、c free.c 和/或 dbgheap.c 中的函数) . 这是可行的,但可能需要一些迭代才能获得需要被否决的全套功能。

如果与 CRT 动态链接,则可以像这样重新定义 malloc、realloc 和 free:

#define malloc(s)    mymalloc(s)
#define realloc(p,s) myrealloc(p,s)
#define free(p)      myfree(p)

mymalloc、myrealloc 和 myfree 的实现可以简单地使用 malloc、realloc 和 free(确保不要在实现 mymalloc 的源文件中使用#define,...),或者您可以使用本机 Windows 函数。

于 2010-03-03T22:10:38.177 回答
0

我会推荐以下内容:

  1. 如果您确实有权访问要分析的源代码,请将所有malloc/realloc调用替换为调用您的 OWN 函数来执行分析。
  2. 如果您无权访问源代码,则可以使用 Microsoft 的Detours库。该库拦截对任意函数的调用并将它们重定向到定制的实现。在此实现中,您可以执行分析,然后回退到标准malloc/realloc
于 2010-03-03T18:09:45.793 回答
0

VS 有许多堆调试工具,例如_heapwalk,它们可以让您遍历堆并获取有关堆上块的信息。您需要做的大部分事情是弄清楚您的堆何时达到最大使用率,这样您就知道何时遍历它并找到它的大小。

于 2010-03-03T18:29:53.040 回答
0

内存验证器可以做到这一点。

您会发现有几种不同的报告很有用:

  • 运行总计。这显示为一个对话框,并提供每个主内存分配器(C 运行时、HeapAlloc、LocalAlloc、GlobalAlloc、CoTaskMemAlloc 等)的当前值、累积值和总值。

  • 对象。这是主要选项卡之一,显示对象类型、大小、计数、累积。还有每个线程和每个 dll 值的子选项卡。

  • 尺寸。这是主要选项卡之一,显示大小、计数、累积。还有每个线程和每个 dll 值的子选项卡。

  • 虚拟的。这将显示内存的图形视图(一个像素 == 一页内存),并具有显示虚拟内存页面和虚拟内存段落的详细虚拟内存数据的子选项卡。

全面披露:我是 Memory Validator 团队的一员。

于 2010-03-10T18:43:09.993 回答