【问题标题】:Any tool to find size of memory allocated dynamically using malloc/realloc?有什么工具可以找到使用 malloc/realloc 动态分配的内存大小?
【发布时间】:2011-01-23 08:15:28
【问题描述】:

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

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

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

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

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

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

谢谢,

-AD

【问题讨论】:

标签: memory dynamic size allocation


【解决方案1】:

如果你用 CRT 静态链接,你可以“否决” malloc、realloc、free 的实现(实际上,所有出现在 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 函数。

【讨论】:

    【解决方案2】:

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

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

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

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

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

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

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

    【讨论】:

      【解决方案3】:

      我会推荐以下内容:

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 2019-07-20
          • 2011-05-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-12-29
          • 2017-06-15
          • 1970-01-01
          相关资源
          最近更新 更多