!堆失败。 ntdll!_HEAP_ENTRY 的类型信息无效
Posted
技术标签:
【中文标题】!堆失败。 ntdll!_HEAP_ENTRY 的类型信息无效【英文标题】:!heap failed. Invalid type information for ntdll!_HEAP_ENTRY 【发布时间】:2011-07-17 03:38:58 【问题描述】:我正在尝试从 Windows Server 2003 SP2 x86 上的完整转储内存文件中转储堆信息。转储是为在 Windows Server 2003 SP2 x64 机器上运行的 32 位混合(本机/clr)应用程序创建的。
从以下 windbg 日志中,我了解到加载的 ntdll.dll 图像不正确,并且与 ntdll.pdb 符号不对应。我试图从目标机器指定 ntdll.dll 的位置,但 windbg 仍然显示模块是从标准位置 (c:\windows\system32) 加载的。
我做错了什么?如何强制windbg加载ntdll
的正确版本?
Microsoft (R) Windows Debugger Version 6.11.0001.404 X86
Copyright (c) Microsoft Corporation. All rights reserved.
[ ... skipped ... ]
0:042> vertarget
Windows Server 2003 Version 3790 (Service Pack 2) MP (4 procs) Free x86 compatible
Product: Server, suite: TerminalServer SingleUserTS
kernel32.dll version: 5.2.3790.4480 (srv03_sp2_gdr.090321-1244)
Machine Name:
Debug session time: Wed Mar 16 16:36:10.000 2011 (GMT-5)
System Uptime: 17 days 10:34:26.068
Process Uptime: 1 days 15:19:14.000
Kernel time: 0 days 1:24:01.000
User time: 0 days 22:07:58.000
0:042> .sympath
Symbol search path is: C:\mscordacwks\v2.0.50727.3615;C:\__exe;SRV*C\Symbols*http://referencesource.microsoft.com/symbols;SRV*c:\Symbols*http://msdl.microsoft.com/download/symbols;SRV*C:\Symbols*http://source.msdn.microsoft.com/symbols
0:042> .exepath
Executable image search path is: C:\__exe;C:\__target\Windows\SysWOW64;
0:042> .reload
[ ... skipped ... ]
0:042> .reload /u ntdll.dll
Unloaded ntdll.dll
0:042> .reload /v /f ntdll.dll
AddImage: C:\WINDOWS\system32\ntdll.dll // why is it still c:\windows\system32
DllBase = 7d600000
Size = 000f0000
Checksum = 000c371a
TimeDateStamp = 4cc1831e
0:042> lm
[ ... skipped ... ]
7d600000 7d6f0000 ntdll (pdb symbols) c:\symbols\wntdll.pdb\9ED8E09C6723448380648C4456726AEF2\wntdll.pdb
0:042> !heap
*************************************************************************
*** Your debugger is not using the correct symbols ***
[ ... skipped ... ]
*** Type referenced: ntdll!_HEAP_ENTRY ***
*************************************************************************
Invalid type information
0:042> lmi vm ntdll
start end module name
7d600000 7d6f0000 ntdll (pdb symbols) ntdll.dll
Symbol file: c:\symbols\wntdll.pdb\9ED8E09C6723448380648C4456726AEF2\wntdll.pdb
Image path: C:\WINDOWS\system32\ntdll.dll
Image name: ntdll.dll
Timestamp: Fri Oct 22 07:27:10 2010 (4CC1831E)
CheckSum: 000C371A
ImageSize: 000F0000
File version: 5.2.3790.4789 // this is correct and
Product version: 5.2.3790.4789 // does correspond to target computer
File flags: 0 (Mask 3F)
File OS: 40004 NT Win32
File type: 2.0 Dll
File date: 00000000.00000000
Translations: 0409.04b0
CompanyName: Microsoft Corporation
ProductName: MicrosoftR WindowsR Operating System
InternalName: ntdll.dll
OriginalFilename: ntdll.dll
ProductVersion: 5.2.3790.4789
FileVersion: 5.2.3790.4789 (srv03_sp2_gdr.101019-0340)
FileDescription: NT Layer DLL
LegalCopyright: c Microsoft Corporation. All rights reserved.
更新:
我在我的问题上移动了一点。我设法连接到客户端的实时流程并尝试 在那里调查堆(heap -s),基本上我得到了相同的结果。
(1520.7c4): Wake debugger - code 80000007 (first chance)
eax=00000000 ebx=00327d50 ecx=00000000 edx=00000000 esi=0030b428 edi=002debe4
eip=7d61c876 esp=002df008 ebp=002df06c iopl=0 nv up ei pl nz na po nc
cs=0023 ss=002b ds=002b es=002b fs=0053 gs=002b efl=00000202
*** ERROR: Symbol file could not be found. Defaulted to export symbols for C:\WINDOWS\system32\ntdll.dll -
ntdll!ZwReadFile+0x15:
7d61c876 c22400 ret 24h
0:000> !heap -s
*************************************************************************
*** Your debugger is not using the correct symbols ***
*** [...skipped...] ***
*** Type referenced: ntdll!_HEAP_ENTRY ***
*************************************************************************
Invalid type information
0:000> .reload
Reloading current modules
................................................................
....................................
0:000> !heap -s
*************************************************************************
*** Your debugger is not using the correct symbols ***
*** [...skipped...] ***
*** Type referenced: ntdll!_HEAP_ENTRY ***
*************************************************************************
Invalid type information
我想我有一个类似于本文http://support.microsoft.com/kb/959207 中提到的问题。 环境和问题好像是一样的,但是dll版本不一样,所以不是我的解决方案。
我认为我必须将此问题上报给 Microsoft。
有人知道我应该去哪里回答这个问题吗?
【问题讨论】:
【参考方案1】:解决方案看起来很简单,但并不明显。
我发现了一个比我的稍大的 wntdll.pdb,其中包含所需的符号并使用命令 .reload /f /i ntdll.dll
重新加载它
并且我采用了以前版本的 windbg 6.11.0001.404,在当前的 6.12.0002.633 !heap
命令中,在我的情况下仍然不起作用。
【讨论】:
【参考方案2】:2003 SP2 ntdll.dll 的 pdb 中似乎不包含 _HEAP_ENTRY 类型 微软发布了一个修复程序http://support.microsoft.com/kb/959207,但是你好像有更高的ntdll版本。
【讨论】:
【参考方案3】:如果转储是使用 64 位工具创建的,则可能会发生这种情况。 Tess's blog 上有很好的信息,它解释了转储位数很重要的原因。
【讨论】:
转储是 32 位的。我可以看到它试图在 windbg 中将其切换到 32 位模式。 0:042> .load wow64exts 0:042> !sw !wow64exts.sw : command invalid on non-64bit target
也许这就是原因(在64 位系统)为什么我无法从其他位置加载 ntdll.dll。
那就是别的了。您可以使用 !lmi 确认模块的类型(您使用的 lmi 没有 !,这是不同的命令)。 !lmi 将转储机器类型,即 I386 或 X64。在您的情况下,您应该期望“!lmi ntdll.dll”会打印 I386。以上是关于!堆失败。 ntdll!_HEAP_ENTRY 的类型信息无效的主要内容,如果未能解决你的问题,请参考以下文章
是啥让 NTDLL!_KiUserApcDispatcher 跳转到不属于进程中模块的地址?
ntdll 0XC0000005 Windbg 中的第一次机会异常
ntdll.dll 中不需要的断点!_LdrpSnapThunk@36() + 0xf5 字节
堆损坏 - 调试断言失败。在 dbgheap.c 第 1322 行表达式 _crtIsValidHeapPointer(pUserData)