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中看不到的有效函数调用堆栈