我有一个C ++ Windows应用程序,每个事务都会泄漏内存。使用perfmon,我可以看到每个事务的专用字节都增加了,而应用程序空闲时内存使用率却是稳定的。
按照先前关于stackoverflow的答案,我使用了Microsoft调试工具中的umdh来跟踪一次内存泄漏。但是仍然有更多的泄漏,并且umdh的结果与我的性能结果不符。
First umdh仍然报告此泄漏,堆栈跟踪为:
+ 36192 ( 2082056 - 2045864) 251 allocs BackTraceCB
+ 4 ( 251 - 247) BackTraceCB allocations
ntdll!RtlAllocateHeapSlowly+00000041
ntdll!RtlAllocateHeap+00000E9F
MSVCR80!malloc+0000007A
Run Code Online (Sandbox Code Playgroud)
这是没有用的,因为第一个调用是malloc,没有说什么叫它。我对这种泄漏感到怀疑,因为在应用程序正在处理事务和空闲时都会报告该泄漏。但是我可以清楚地看到空闲时没有内存泄漏。并且在处理事务时报告的内存泄漏与作为性能报告处理的事务不成比例。
umhd没有显示任何其他泄漏,尽管我知道至少还有一个未显示。我刚刚从网上搜索中学到Windows应用程序可以有多个堆。
当我用尽所有选项时,将不胜感激地收到任何跟踪此问题的指针。
很抱歉回答我自己的问题,但我最终将问题追溯到我如何使用 Orbix。
看起来 orbix 库在 Windows 平台上使用自己的堆。这意味着大多数内存泄漏检测对于orbix中的泄漏不起作用,我尝试了boundschecker和umhd.exe。
为了隔离这个问题,我发现一些代码可以转储应用程序中每个堆的内存:http ://www.abstraction.net/content/articles/analyzing%20the%20heaps%20of%20a%20win32%20process.htm
我用它来转储每个事务之前和之后的堆使用情况,然后在每 500 个事务之后,这表明每次都在增长相同的堆。然后我列出了该堆中每个条目的地址。检查这些区域的内存后,我发现它们包含 orbix 编组数据。有了这些信息,我终于找到了一些没有被清理的对象引用。
归档时间: |
|
查看次数: |
7398 次 |
最近记录: |