我有一个c++ windows应用程序,它会在每个事务中泄漏内存。使用perfmon,我可以看到私有字节随着每个事务的增加而增加,当应用程序处于空闲状态时,内存使用量是持平的。
根据以前关于堆栈溢出的答案,我使用microsoft调试工具中的umdh跟踪一个内存泄漏。然而,仍然有更多的漏洞,而且umdh的结果与我的perfmon结果不匹配。
首先,umdh仍然报告此泄漏,堆栈跟踪是:
+ 36192 ( 2082056 - 2045864) 251 allocs BackTraceCB
+ 4 ( 251 - 247) BackTraceCB allocations
ntdll!RtlAllocateHeapSlowly+00000041
ntdll!RtlAllocateHeap+00000E9F
MSVCR80!malloc+0000007A这是没用的,因为第一个调用是malloc,它没有说什么叫它。我对此漏洞表示怀疑,因为无论是在应用程序处理事务时还是在空闲时,都会报告此漏洞。但我能清楚地看到,当内存空闲时,内存没有泄漏。处理事务时报告的内存泄漏与perfmon报告处理的事务不成比例。
食环署并没有显示任何其他的漏洞,虽然我知道至少还有一项没有显示。我刚刚从搜索网络中了解到,一个windows应用程序可以有多个堆。
当我没有选择的时候,任何追踪这个问题的指示都会被感激地收到。
发布于 2009-04-09 13:41:53
很抱歉回答我自己的问题,但我最终找到了这个问题,直到我如何使用Orbix。
orbix库在windows平台上使用自己的堆。这意味着大多数内存泄漏检测对于orbix中的泄漏都不起作用,我尝试了boundschecker和umhd.exe。
为了隔离这个问题,我找到了一些代码来转储应用程序中每个堆的内存:http://www.abstraction.net/content/articles/analyzing%20the%20heaps%20of%20a%20win32%20process.htm
我使用它来转储每个事务之前和之后的堆使用情况,然后在每500个事务之后,这表明每次都在增长相同的堆。然后,我列出了这个堆中每个条目的地址。检查这些区域的内存,我发现这些区域包含orbix编组数据。有了这些信息,我终于找到了一些未被清理的对象引用。
发布于 2009-04-11 12:31:47
对我来说,在某些情况下,umdh失败了--另一个名为LeakDiag的免费MS工具成功了。它允许截取比umdh多得多的分配器类型,包括它所称的“MPHeap分配器”,我怀疑可能对您有用。如果你有空的话--我很好奇这是否真的有帮助.
发布于 2009-04-03 08:21:13
除非您的应用程序(或它使用的库)显式地创建自己的堆,否则只需要担心一个堆。大多数图书馆不这样做,所以我建议这不应该是你调查的主要途径。
https://stackoverflow.com/questions/712975
复制相似问题