如何在所有堆中使用umdh.exe跟踪内存泄漏? 我有一个C++事务,它会泄漏每个事务的内存。使用perfmon,我可以看到私有字节随着每个事务的增加而增加,当应用程序空闲时,内存使用率是持平的
根据前面关于stackoverflow的回答,我使用microsoft调试工具中的umdh来跟踪一个内存泄漏。但是仍然有更多的泄漏,umdh的结果与我的perfmon结果不匹配 首先,umdh仍报告此泄漏,堆栈跟踪为:如何在所有堆中使用umdh.exe跟踪内存泄漏? 我有一个C++事务,它会泄漏每个事务的内存。使用perfmon,我可以看到私有字节随着每个事务的增加而增加,当应用程序空闲时,内存使用率是持平的,c++,memory-leaks,C++,Memory Leaks,根据前面关于stackoverflow的回答,我使用microsoft调试工具中的umdh来跟踪一个内存泄漏。但是仍然有更多的泄漏,umdh的结果与我的perfmon结果不匹配 首先,umdh仍报告此泄漏,堆栈跟踪为: + 36192 ( 2082056 - 2045864) 251 allocs BackTraceCB + 4 ( 251 - 247) BackTraceCB allocations ntdll!RtlAllocateHe
+ 36192 ( 2082056 - 2045864) 251 allocs BackTraceCB
+ 4 ( 251 - 247) BackTraceCB allocations
ntdll!RtlAllocateHeapSlowly+00000041
ntdll!RtlAllocateHeap+00000E9F
MSVCR80!malloc+0000007A
这是没有用的,因为第一个调用是malloc,它没有说它叫什么。我对这个漏洞有怀疑,因为它是在应用程序处理事务和空闲时报告的。但我可以清楚地看到,空闲时没有内存泄漏。处理事务时报告的内存泄漏与作为perfmon报告处理的事务不成比例
umhd没有显示任何其他泄漏,尽管我知道至少还有一个未显示。我刚刚从网上搜索中了解到,一个windows应用程序可以有多个堆
- 是否umhd只报告其中一个堆的内存使用情况?例如默认堆还是crt堆李>
- 如何跟踪其他堆中的内存使用情况李>
- 如何找出哪些DLL/模块正在使用其他堆
当我没有选择的时候,我会感激地收到任何关于跟踪这个问题的指针。除非您的应用程序(或它使用的库)显式地创建自己的堆,否则只有一个堆需要担心。大多数库都不这样做,所以我建议这不应该是您进行调查的主要途径。也许umdh在查找代码的调试符号时遇到了问题?这可能解释了堆栈跟踪不完整的原因。请确保您已经用符号构建了它,并且可以找到它们。我过去经常做代码检查以查找内存泄漏 我一直在寻找的一些东西:
当然,代码审查可能很耗时,这取决于您必须审查的代码库。但是,如果您可以限制查找指针分配/使用所需的区域,可能会有回报。在我的大多数情况下都是这样 很抱歉回答我自己的问题,但我最终还是找到了如何使用Orbix的问题 很明显,orbix库在windows平台上使用自己的堆。这意味着大多数内存泄漏检测对于orbix中的泄漏不起作用,我尝试了boundschecker和umhd.exe 为了解决这个问题,我发现一些代码会转储应用程序中每个堆的内存:
我使用它来转储每个事务前后的堆使用情况,然后在每500个事务之后,这表明每次都有相同的堆在增长。然后我列出了这个堆中每个条目的地址。通过检查这些区域中的内存,我发现这些区域包含orbix编组数据。有了这些信息,我终于找到了一些未被清理的对象引用。对于我来说,在umdh失败的情况下——另一个称为Successed的MS免费工具。它允许截取比umdh多得多的分配器类型,包括它所称的“MPHeap分配器”,这可能对您有用。如果你有空的话-我很好奇这是否真的有帮助..我们的应用程序同时使用orbix和oci(oracle),所以我想知道他们是否可以做一些不寻常的事情。这些oracle库已经存在,每天都被数百万人使用-我不认为寻找它们的漏洞是一个好方法。谢谢。我相当肯定我的应用程序的符号和nt符号被正确配置,因为在我修复第一个漏洞时,其他堆栈跟踪被正确显示。在这种情况下,我猜分配来自外部库。问题中的堆栈跟踪被证明是一个转移视线的问题。它被周期性地分配和释放,因此总是被缝合以出现在所报告的增量umdh中。泄漏原来是另一堆。我找不到任何适用于特定于应用程序的受控堆的工具。我使用代码遍历所有堆并将其写入文件。一旦数据表明orbix是问题所在,我就对每个事务的每个orbix调用进行测试,直到发现内存泄漏。