2011-03-17 24 views
5

我試圖從坐落在Windows Server 2003 SP2 x86上的完整轉儲內存文件轉儲堆信息。轉儲是爲運行在Windows Server 2003 SP2 x64計算機上的32位混合(native/clr)應用程序創建的。!堆失敗。 ntdll!_HEAP_ENTRY的無效類型信息

從以下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. 

UPDATE:

我在問題移動得遠一點。我設法連接到客戶端的實時進程,並試圖 調查堆(堆-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。

有人知道我應該去哪裏解決這個問題嗎?

回答

2

該解決方案似乎很容易但不明顯。

  • 我發現wntdll.pdb比我稍大其中包含所需的符號,並用命令重新裝入.reload/F/I NTDLL.DLL

  • 和我採取windbg的6.11.0001.404的以前的版本,在當前的6.12.0002.633!堆命令仍然不起作用。

3

如果使用64位工具創建轉儲,則可能會發生這種情況。關於Tess's blog有很好的信息可以解釋爲什麼堆場的重要性。

+1

轉儲是32位。我可以看到它試圖在windbg中將其切換到32位模式。

 0:042> .load wow64exts 0:042> !sw !wow64exts.sw : command invalid on non-64bit target 
也許這就是原因(在64位系統上創建32位轉儲)爲什麼我無法從其他位置加載ntdll.dll。 – 2011-03-21 18:01:16

+1

然後它是別的。您可以使用!lmi確認模塊的類型(您使用lmi時不使用!,這是不同的命令)。 !lmi將轉儲機器類型,它將是I386或X64。在你的情況下,你應該期望「!lmi ntdll.dll」會打印I386。 – 2011-03-22 04:04:55