Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/16.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
Windows 如何在MFC 8.0应用程序中访问malloc的完整堆栈跟踪?_Windows_Debugging_Visual C++_Memory Leaks_Leakdiag - Fatal编程技术网

Windows 如何在MFC 8.0应用程序中访问malloc的完整堆栈跟踪?

Windows 如何在MFC 8.0应用程序中访问malloc的完整堆栈跟踪?,windows,debugging,visual-c++,memory-leaks,leakdiag,Windows,Debugging,Visual C++,Memory Leaks,Leakdiag,我试图在windows MFC 8.0应用程序(发布版本)中查找内存泄漏 由于VC8的原因,使用WinDbg(或umdh)无法显示分配的完整堆栈跟踪后,我尝试应用建议的解决方案(即使用启用DbgHlp StackWalk的LeakDiag),但我只意识到LeakDiag在监视C运行时分配器时不会生成日志文件,在监视Windows堆分配器时,它确实可以工作,但堆栈跟踪在malloc调用时结束 符号配置正确,因为我可以在生成的文件中看到函数名、文件名、行等 有人知道为什么我不能记录C运行时分配器吗?

我试图在windows MFC 8.0应用程序(发布版本)中查找内存泄漏

由于VC8的原因,使用WinDbg(或umdh)无法显示分配的完整堆栈跟踪后,我尝试应用建议的解决方案(即使用启用DbgHlp StackWalk的LeakDiag),但我只意识到LeakDiag在监视C运行时分配器时不会生成日志文件,在监视Windows堆分配器时,它确实可以工作,但堆栈跟踪在malloc调用时结束

符号配置正确,因为我可以在生成的文件中看到函数名、文件名、行等

有人知道为什么我不能记录C运行时分配器吗?为什么即使使用DbgHlp StackWalk API也无法获得完整的堆栈跟踪

如果你能提供任何提示,我将不胜感激

其他信息:

我的堆栈跟踪的外观:

我用WinDbg得到了这个。地址是一个报告人!heap-l作为泄漏的块

0:000> !heap -p -a 25b18400  
address 25b18400 found in
_HEAP @ 2a70000
  HEAP_ENTRY Size Prev Flags    UserPtr UserSize - state
    25b183f8 0008 0000  [07]   25b18400    00021 - (busy)
    Trace: 00a4
    7c97d6dc ntdll!RtlDebugAllocateHeap+0x000000e1
    7c959d18 ntdll!RtlAllocateHeapSlowly+0x00000044
    7c92b298 ntdll!RtlAllocateHeap+0x00000e64
    78134d83 MSVCR80!malloc+0x0000007a
有人知道为什么我不能记录C运行时分配器吗

您正在使用调试版本?调试CRT有自己的堆检查功能,可以击败UMDH和其他在全局OS堆上运行的工具。使用UMDH和friends时,请确保所有MFC和MSVCRT堆调试功能都已关闭

也可能是您,或者您的流程中的某个东西,从默认值0开始

否则,8.0版本的CRT应该只将请求转发到全局堆,这正是堆调试工具所需要的

为什么即使使用DbgHlp StackWalk API也无法获得完整的堆栈跟踪

我认为Skywing在你提供的链接中对细节描述得相当好。再重复一次,他可能有点言过其实的部分是“在x86上,完美的”堆栈跟踪通常是不可能的,因为没有一个特定函数(调试符号之外)附加元数据来描述如何通过它展开。”。对于DbgHlp来说,使用EBP作为暂存器来展开函数(如MSVCRT的malloc)是非常不切实际的

当然,您可以从正确的源代码重新构建自己的CRT库,或者尝试替换CRT malloc/free


实际上,我认为最好的办法是在x64平台上重现泄漏,在那里,堆栈展开保证非常可靠。

为什么不使用第三方工具

即下载“英特尔并行检验器”的评估副本。它的安装非常简单,并针对现有的发布版本运行。在大多数情况下,它显示了一个完整的堆栈(我很确定它也会发现一些误报)

从configuration manager中选择发布版本,并确保它创建了pdb文件(在链接器选项中)。然后开始“检查内存错误”


还有许多其他类似的工具:AQTime、GlowCode。所有这些都不需要重新编译或插装。

我已经尝试过英特尔并行工作室,但它只是挂起。。。它看起来很重,我的申请也很重。。。除此之外,我正在寻找的内存泄漏只发生在缺乏任何开发工具的生产计算机中。我可以安装一个编译器,但是如果IPS在我的开发机器上都不能启动,为什么还要麻烦呢。。。我来看看你提到的其他工具。谢谢你的回答!parallel studio的最新版本似乎更加健壮——Beta则不然。但是您至少可以在没有编译器的情况下使用GlowCode。据我所知,只需要一个pdb文件。我最近对它进行了评估。虽然它给出了一些内部错误,但它可以实时工作,我也得到了一些结果。GlowCode似乎是一个很棒的分析器和内存检查器,尽管它在周末分析我的应用程序时遇到了严重的问题。无论如何,它被证明是有用的,而且速度非常快,尽管我还没有找到任何内存泄漏。。。但是它给了我MFC8.0应用程序的完整堆栈跟踪,所以我马上接受你的回答。非常感谢。