代码之家  ›  专栏  ›  技术社区  ›  Pieter

在大内存分配时使进程崩溃

  •  4
  • Pieter  · 技术社区  · 14 年前

    我正试图找到一个明显的内存泄漏(一次15MB,但在多个地方进行这样的分配)。我检查了最明显的地方,然后使用了aqtime,但我仍然无法精确定位。现在我看到剩下两个选项:

    1)使用setProcessWorkingSetSize:我已经尝试过了,但是当使用超过150MB时,我的进程很高兴地继续运行:

    DWORD MemorySize = 150*1024*1024;
    SetProcessWorkingSetSize( GetCurrentProcess(), MemorySize/2, MemorySize*2 );
    

    2)每次分配超过1MB时设置断点。我该怎么做呢,重载运算符new,里面有一个“if>1MB”?

    6 回复  |  直到 14 年前
        1
  •  1
  •   Chris K    14 年前

    setprocessworkingsetsize并不意味着你认为它意味着什么——它只是一个提示,告诉操作系统“在内存中”要保留多少内存,而不是分页到磁盘。现代操作系统在将未使用的内存分页到磁盘时非常激进,尤其是windows。

    IBM Rational Purify 是除了非常彻底的代码分析之外的唯一解决方案。在Windows上,对于C/C++,没有更好的工具来查找内存泄漏。在mac或linux上,你可以使用valgrind,但是afaik,它还没有在windows上运行。

        2
  •  1
  •   morechilli    14 年前

    从您的标签中,您使用的是C++和VisualStudio。

    在这种情况下,您可以简单地使用microsoft为您提供的crt调试挂钩。

    在msdn中搜索crtsetallochook。

    在调试构建中,这将允许拦截每个分配—您可以忽略小的分配,只需在大的分配上设置断点或调用::debug break。

        3
  •  0
  •   Billy ONeal IS4    14 年前

    1)使用setProcessWorkingSetSize:我已经尝试过了,但是当使用超过150MB时,我的进程很高兴地继续运行:

    什么是setprocessworkingsetsize返回?呼叫成功了吗?

    2)每次分配超过1MB时设置断点。我该怎么做呢,重载运算符new,里面有一个“if>1MB”?
    是的,应该可以。

    检查由 C Runtime Debug Heap 由MSVC提供。

        4
  •  0
  •   Michael Dorgan    14 年前

    在一个嵌入式系统上,我们会完全按照您的建议来做——在超过某个阈值的任何new/memalloc调用上中断,在free/delete上也这样做。单调乏味,但它会把工作做完。大小上的条件断点应该可以满足您的要求,但在删除时,情况会更糟。

        5
  •  0
  •   Kirill V. Lyadvinsky    14 年前

    尝试使用 UMDH . 它是一个免费的微软实用程序,允许查找内存泄漏。

        6
  •  0
  •   Pieter    14 年前

    抱歉,所有建议的解决方案都不起作用。最后通过使用aqtime和大量的调试输出得到了修复。关闭时泄漏得到了清理,所以它在大海捞针。

    不过,我还是对如何有效地找到这个感兴趣。我试图在新操作符上设置一个条件断点,但调试器花费了很长时间来计算每个分配的“bytes>1024*1024”。