有没有找到使用malloc / realloc动态分配的内存大小的工具?

时间:2010-03-03 18:06:33

标签: memory dynamic size allocation

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

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

a)可能存在这样的情况:1KB的一些内存被malloc'ed,然后被释放,然后2KB的内存被malloc'ed。所以max是2KB,我需要得到的值不是1 + 2 = 3KB。

所以我必须真正看到这个代码中发生了所有malloc / free并为此添加代码,我想避免这样做。

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

2)MS Visual Studio 2005/2008本身是否提供此类内容?

感谢,

-AD

4 个答案:

答案 0 :(得分:1)

如果你静态地链接到CRT,你可以“推翻”malloc,realloc,free的实现(实际上,所有出现在malloc.c,realloc,c free.c和/或dbgheap.c中的函数) CRT)。这是可行的,但在获得需要推翻的完整功能集之前可能需要一些迭代。

如果您动态链接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函数。

答案 1 :(得分:0)

我会推荐以下内容:

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

答案 2 :(得分:0)

VS有许多堆调试工具,例如_heapwalk,它可以让你遍历堆并获取有关堆上块的信息。你需要做的大部分工作就是弄清楚当你的堆最大使用量时,你知道何时走路并找到它的大小。

答案 3 :(得分:0)

Memory Validator可以做到这一点。

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

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

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

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

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

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