首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在所有堆中使用umdh.exe跟踪内存泄漏?

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

Stack Overflow用户
提问于 2009-04-03 08:06:01
回答 4查看 8.1K关注 0票数 5

我有一个c++ windows应用程序,它会在每个事务中泄漏内存。使用perfmon,我可以看到私有字节随着每个事务的增加而增加,当应用程序处于空闲状态时,内存使用量是持平的。

根据以前关于堆栈溢出的答案,我使用microsoft调试工具中的umdh跟踪一个内存泄漏。然而,仍然有更多的漏洞,而且umdh的结果与我的perfmon结果不匹配。

首先,umdh仍然报告此泄漏,堆栈跟踪是:

代码语言:javascript
运行
复制
+   36192 ( 2082056 - 2045864)    251 allocs    BackTraceCB
+       4 (    251 -    247)    BackTraceCB allocations

    ntdll!RtlAllocateHeapSlowly+00000041
    ntdll!RtlAllocateHeap+00000E9F
    MSVCR80!malloc+0000007A

这是没用的,因为第一个调用是malloc,它没有说什么叫它。我对此漏洞表示怀疑,因为无论是在应用程序处理事务时还是在空闲时,都会报告此漏洞。但我能清楚地看到,当内存空闲时,内存没有泄漏。处理事务时报告的内存泄漏与perfmon报告处理的事务不成比例。

食环署并没有显示任何其他的漏洞,虽然我知道至少还有一项没有显示。我刚刚从搜索网络中了解到,一个windows应用程序可以有多个堆。

  • 难道食环署只报告其中一个堆的内存使用情况吗?例如默认的还是crt堆?
  • 如何跟踪其他堆中的内存使用情况?
  • 以及如何找出哪些dll/模块正在使用其他堆?

当我没有选择的时候,任何追踪这个问题的指示都会被感激地收到。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 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编组数据。有了这些信息,我终于找到了一些未被清理的对象引用。

票数 1
EN

Stack Overflow用户

发布于 2009-04-11 12:31:47

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

票数 3
EN

Stack Overflow用户

发布于 2009-04-03 08:21:13

除非您的应用程序(或它使用的库)显式地创建自己的堆,否则只需要担心一个堆。大多数图书馆不这样做,所以我建议这不应该是你调查的主要途径。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/712975

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档