c++ - 如何使用 umdh.exe 在所有堆中跟踪内存泄漏?

标签 c++ memory-leaks

我有一个 C++ Windows 应用程序,它会在每个事务中泄漏内存。使用 perfmon 我可以看到私有(private)字节随着每个事务的增加而增加,当应用程序空闲时内存使用率是平稳的。

根据之前关于 stackoverflow 的回答,我使用 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 报告处理的事务不成比例。

umhd 没有显示任何其他泄漏,但我知道至少还有一个未显示。我刚刚从网上搜索得知 Windows 应用程序可以有多个堆。

  • 会不会是 umhd 只报告其中一个堆的内存使用情况?例如默认或crt 堆?
  • 如何跟踪其他堆中的内存使用情况?
  • 如何找出哪些 dll/模块正在使用其他堆?

由于我已经没有其他选择了,所以如果能提供任何追踪此问题的建议,我们将不胜感激。

最佳答案

对我来说,在 umdh 失败的情况下 - 另一个名为 LeakDiag 的 MS 免费工具成功了。它允许拦截比 umdh 更多的分配器类型,包括它所谓的“MPHeap 分配器”,I suspect可能对你有用。如果您有空闲时间 - 我很好奇这是否真的有帮助..

关于c++ - 如何使用 umdh.exe 在所有堆中跟踪内存泄漏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/712975/

相关文章:

c++ - boost program_options 的自定义验证器不适用于 GCC,适用于 MSVC

c++需要将int类型转换为unsigned int

c++ - 为什么不能在静态成员函数中使用const成员呢?

windows - "Out of memory"带有简单的 Win32::Unicode::File readline 循环和 Strawberry Perl

r - 连接关闭的内存泄漏

c++ - 防止内存泄漏(具体情况)

c++ - 在 VSCODE 中调试 : Watching vectors with length > 1000

c++ - 代码中未初始化的指针

objective-c - 如何通过重用单个 viewcontroller 加载 xibs 并处理内存警告?

iphone - [NSMutableArray array] 与 [[NSMutableArray alloc] init] 之间的区别