我有一个包含所有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
答案 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)
我会推荐以下内容:
malloc/realloc
调用替换为您将执行分析的OWN函数调用。malloc/realloc
。答案 2 :(得分:0)
VS有许多堆调试工具,例如_heapwalk
,它可以让你遍历堆并获取有关堆上块的信息。你需要做的大部分工作就是弄清楚当你的堆最大使用量时,你知道何时走路并找到它的大小。
答案 3 :(得分:0)
Memory Validator可以做到这一点。
您会发现有几种不同的报告非常有用:
运行总计。它显示为一个对话框,为每个主内存分配器(C运行时,HeapAlloc,LocalAlloc,GlobalAlloc,CoTaskMemAlloc等)提供当前值,累计值和总值。
对象。这是主要选项卡之一,显示对象类型,大小,计数,累计。 还有每个线程和每个dll值的子选项卡。
尺寸。这是主要选项卡之一,显示大小,计数,累计。 还有每个线程和每个dll值的子选项卡。
虚拟。这将显示内存的图形视图(一个像素= =一页内存),并显示子磁盘,显示虚拟内存页面和虚拟内存段落的详细虚拟内存数据。
完全披露:我是Memory Validator团队的一员。