Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/160.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在所有堆中使用umdh.exe跟踪内存泄漏? 我有一个C++事务,它会泄漏每个事务的内存。使用perfmon,我可以看到私有字节随着每个事务的增加而增加,当应用程序空闲时,内存使用率是持平的_C++_Memory Leaks - Fatal编程技术网

如何在所有堆中使用umdh.exe跟踪内存泄漏? 我有一个C++事务,它会泄漏每个事务的内存。使用perfmon,我可以看到私有字节随着每个事务的增加而增加,当应用程序空闲时,内存使用率是持平的

如何在所有堆中使用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

根据前面关于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在查找代码的调试符号时遇到了问题?这可能解释了堆栈跟踪不完整的原因。请确保您已经用符号构建了它,并且可以找到它们。

我过去经常做代码检查以查找内存泄漏

我一直在寻找的一些东西:

  • 继承问题:基类不提供虚拟析构函数,并且以多态方式使用
  • 在代码中搜索指针声明或指针分配(查找*声明、关键字new或malloc用法),并查看代码片段,以动态分配对象的生命周期为目标

  • 当然,代码审查可能很耗时,这取决于您必须审查的代码库。但是,如果您可以限制查找指针分配/使用所需的区域,可能会有回报。在我的大多数情况下都是这样

    很抱歉回答我自己的问题,但我最终还是找到了如何使用Orbix的问题

    很明显,orbix库在windows平台上使用自己的堆。这意味着大多数内存泄漏检测对于orbix中的泄漏不起作用,我尝试了boundschecker和umhd.exe

    为了解决这个问题,我发现一些代码会转储应用程序中每个堆的内存:


    我使用它来转储每个事务前后的堆使用情况,然后在每500个事务之后,这表明每次都有相同的堆在增长。然后我列出了这个堆中每个条目的地址。通过检查这些区域中的内存,我发现这些区域包含orbix编组数据。有了这些信息,我终于找到了一些未被清理的对象引用。

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

    我们的应用程序同时使用orbix和oci(oracle),所以我想知道他们是否可以做一些不寻常的事情。这些oracle库已经存在,每天都被数百万人使用-我不认为寻找它们的漏洞是一个好方法。谢谢。我相当肯定我的应用程序的符号和nt符号被正确配置,因为在我修复第一个漏洞时,其他堆栈跟踪被正确显示。在这种情况下,我猜分配来自外部库。问题中的堆栈跟踪被证明是一个转移视线的问题。它被周期性地分配和释放,因此总是被缝合以出现在所报告的增量umdh中。泄漏原来是另一堆。我找不到任何适用于特定于应用程序的受控堆的工具。我使用代码遍历所有堆并将其写入文件。一旦数据表明orbix是问题所在,我就对每个事务的每个orbix调用进行测试,直到发现内存泄漏。