Memory 是否有任何工具可以使用malloc/realloc查找动态分配的内存大小?

Memory 是否有任何工具可以使用malloc/realloc查找动态分配的内存大小?,memory,dynamic,size,allocation,Memory,Dynamic,Size,Allocation,我有一个MS Visual Studio 2005工作区,其中包含所有c代码。此应用程序(exe)使用malloc和realloc从堆中动态分配内存。我想在运行特定测试用例时,使用malloc/realloc计算此应用程序在堆上分配的最大大小 我不想通过记录malloc大小并累加来更改代码,因为: a) 可能有一种情况,一些1KB的内存被malloc'ed,然后被释放,然后一个2KB的内存被malloc'ed。所以max是2KB,我需要得到它的值,而不是1+2=3KB 因此,我必须真正了解mal

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

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

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

因此,我必须真正了解malloc/free在代码中的位置,并为此添加代码,这是我想要避免的

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

2) 微软VisualStudio2005/2008本身是否提供了类似的功能

谢谢


-我建议如下:

  • 如果您确实可以访问要分析的源代码,请将所有
    malloc/realloc
    调用替换为您自己执行分析的函数调用
  • 如果您无法访问源代码,可以使用Microsoft提供的库。库截取对任意函数的调用,并将它们重定向到自定义实现。在此实现中,您可以执行分析,然后返回标准
    malloc/realloc

  • 我建议如下:

  • 如果您确实可以访问要分析的源代码,请将所有
    malloc/realloc
    调用替换为您自己执行分析的函数调用
  • 如果您无法访问源代码,可以使用Microsoft提供的库。库截取对任意函数的调用,并将它们重定向到自定义实现。在此实现中,您可以执行分析,然后返回标准
    malloc/realloc

  • VS有许多堆调试工具,例如
    \u heapwalk
    ,可以让您遍历堆并获取堆上块的信息。您需要做的大部分工作是确定堆何时处于最大使用状态,以便知道何时对其进行遍历并找到其大小。

    VS有许多堆调试工具,如
    \u heapwalk
    ,这些工具将允许您遍历堆并获取堆上块的信息。您需要做的大部分工作是确定堆何时处于最大使用状态,以便知道何时遍历堆并找到其大小。

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

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

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

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

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

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

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

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


    完全披露:我是内存验证器团队的一员。

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

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

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

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

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

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

    完整披露:我是内存验证程序团队的一员。

    另请参阅。另请参阅。