VC++ 6.0 - WinDbg 堆栈跟踪显示 malloc 处的崩溃点

Posted

技术标签:

【中文标题】VC++ 6.0 - WinDbg 堆栈跟踪显示 malloc 处的崩溃点【英文标题】:VC++ 6.0 - WinDbg stack trace shows a crash point at malloc 【发布时间】:2011-12-14 09:41:22 【问题描述】:

应用程序崩溃后windbg中的堆栈跟踪如下:

ntdll+0x11766
msvcrt!free+0x1ae
msvcrt!free+0x1cc
msvcrt!malloc+0x27
mfc42!Ordinal823+0x2f

请告诉我这个 Ordinal 是什么意思,为什么 free 会被调用两次?

【问题讨论】:

请出示一些代码,否则没人能帮忙。 Ordinal823(或一般的 OrdinalXXX)显然是由 DLL 导出的匿名函数:codeguru.com/forum/showthread.php?t=392371 查看%ProgramFiles%\Microsoft Visual Studio\VC98\MFC\SRC\Intel\MFC42.DEF,序号823是??2@YAPAXI@Z,是修饰名operator new. 小心你对调用堆栈的解释:它表明free被调用了两次(或者根本没有,必然);只有调试器可以为调用malloc 上方的两个堆栈帧找到最近的公共符号是free 【参考方案1】:

当崩溃发生在 malloc 或 free 内部时,原因很可能是堆损坏。 损坏的原因可能发生在与当前堆栈无关的代码中。 要验证堆是否损坏,请使用

!heap –s –v

为此你需要符号,提前使用

.symfix

您可能根本没有空闲,由于缺少符号堆栈显示 偏移到最近的出口,因此偏移量很大(free+0x1cc) 检查 .symfix 后的堆栈并享受!

要找到内存损坏的根本原因,可以使用不同的方法,但如果可能的话,整页堆是一个不错的方法。

【讨论】:

以上是关于VC++ 6.0 - WinDbg 堆栈跟踪显示 malloc 处的崩溃点的主要内容,如果未能解决你的问题,请参考以下文章

Windbg可以看到Visual Studio中看不到的有效函数调用堆栈

如果使用WINDBG来调试C语言程序.

给定 %d 时,VC++ 6.0 应用程序在 CString::Format 内崩溃

如何使用大量 CPU 快速获取线程的托管堆栈跟踪

vc++6.0怎么快捷注释多行代码

Windbg Call Stack窗口的使用