2009-07-15 86 views
0

我想在Windows MFC 8.0应用程序(发布版本)中发现内存泄漏。如何在MFC 8.0应用程序中访问malloc的完整堆栈跟踪?

未能到场使用WinDbg的(或UMDH)由于VC8 CRT's malloc problem with FPO分配的完整堆栈跟踪后,我试图以应用解决方案提出here(即使用LeakDiag与DbgHlp StackWalk启用)才知道原来LeakDiag做在监视C运行时分配器时,不会生成日志文件,但是,在监视它的Windows堆分配器时,它确实起作用,但同样,堆跟踪在malloc调用中结束。

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

有谁知道我为什么不能登录C Runtime Allocator?以及为什么即使使用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 

回答

1

为什么不使用第三方工具?

I.e.下载intel并行检查员的评估副本。它非常简单地安装并运行在现有的发行版本上。它显示 - 在大多数情况下 - 一个完整的堆栈(我很确定,但它也发现一些误报)。

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

存在许多其他类似的工具:AQTime,GlowCode。所有这些都不需要重新编译或检测。

+0

我已经尝试过英特尔并行工作室,但它只是挂起...它似乎很沉重,所以是我的应用程序... 除此之外,我正在寻找的内存泄漏只发生在一个生产电脑缺乏任何开发工具。我可以安装一个编译器,但为什么IPS甚至不能在我的开发机器上启动呢? 我会看看你提到的其他工具。 谢谢你的回答! – 2009-08-06 12:07:03

1

有谁知道为什么我无法登录C运行时分配器?

您正在使用Debug版本吗?调试CRT拥有自己的堆检查功能,可以击败在全局操作系统堆上运行的UMDH和其他工具。确保在使用UMDH和朋友时,所有MFC和MSVCRT堆调试功能关闭

也许还你,或者从0

否则默认的东西在你的进程,changed the small-block allocator threshold,8.0版CRT应该只是请求转发到全局堆,这是你想要的堆调试工具。

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

我认为Skywing在你给出的链接中描述的细节非常好。为了重新迭代,他可能声明的部分是“在x86上”,完美的“堆栈跟踪通常是不可能的,因为没有元数据附有特定函数(调试符号之外),该函数描述了如何放松过去。“对于DbgHlp来说,使用EBP作为临时寄存器来解开函数(比如MSVCRT的malloc)是非常不切实际的。

你当然可以从正确的来源重建自己的CRT库,或者尝试替换CRT malloc/free。

真的,我认为你最好的举措是在x64平台上重现泄漏,其中堆栈展开保证相当可靠。

相关问题