2010-11-25 20 views
3

我想看到的WinDbg使用 'DT' 命令IMAGE_DOS_HEADER結構:是否可以在windbg調試會話中向公共符號添加缺失符號?

0:001> dt ntdll!IMAGE_DOS_HEADER 
**Symbol ntdll!IMAGE_DOS_HEADER not found** 

我搜索,發現別人已經能夠做到這一點: MSDN Blogs > Junyoung's Blog > Portable Executable File Format on Memory Dump

0:000> dt IMAGE_DOS_HEADER 77c00000 
ntdll!IMAGE_DOS_HEADER 
    +0x000 e_magic   : 0x5a4d ? MZ 
    +0x002 e_cblp   : 0x90 
    +0x004 e_cp    : 3 
    +0x006 e_crlc   : 0 
    +0x008 e_cparhdr  : 4 
    +0x00a e_minalloc  : 0 
    +0x00c e_maxalloc  : 0xffff 
    +0x00e e_ss    : 0 
    +0x010 e_sp    : 0xb8 
    +0x012 e_csum   : 0 
    +0x014 e_ip    : 0 
    +0x016 e_cs    : 0 
    +0x018 e_lfarlc   : 0x40 
    +0x01a e_ovno   : 0 
    +0x01c e_res   : [4] 0 
    +0x024 e_oemid   : 0 
    +0x026 e_oeminfo  : 0 
    +0x028 e_res2   : [10] 0 
    +0x03c e_lfanew   : 232 

是否有可能丟失的符號添加到NTDLL的公共符號讓我可以一在windbg調試會話中訪問數據結構字段?

這是很奇怪的 - 我想在WIN7和WINXP系統下,得到了不同的結果 - 的WinXP:

0:015> dt ntdll!*HEADER* 
      ntdll!_IMAGE_NT_HEADERS 
      ntdll!_IMAGE_FILE_HEADER 
      ntdll!_IMAGE_OPTIONAL_HEADER 
      ntdll!_SLIST_HEADER 
      ntdll!_DISPATCHER_HEADER 
      ntdll!_IMAGE_SECTION_HEADER 

Win7的:

0:000> dt ntdll!*HEADER* 
      ntdll!_IMAGE_NT_HEADERS 
      ntdll!_IMAGE_FILE_HEADER 
      ntdll!_IMAGE_OPTIONAL_HEADER 
      ntdll!_IMAGE_DOS_HEADER 
      ntdll!_SLIST_HEADER 
      ntdll!_DISPATCHER_HEADER 
      ntdll!_MM_PAGE_ACCESS_INFO_HEADER 
      ntdll!_WHEA_ERROR_RECORD_HEADER 
      ntdll!_HEAP_USERDATA_HEADER 
      ntdll!_HEAP_USERDATA_HEADER 
      ntdll!_WHEA_ERROR_RECORD_HEADER_VALIDBITS 
      ntdll!_WHEA_ERROR_RECORD_HEADER_FLAGS 
      ntdll!_XSAVE_AREA_HEADER 

因此,似乎_IMAGE_DOS_HEADER符號從我的問題是 - - WINXP的ntdll.dll中的公共符號如何添加符號,如果我知道的結構,一個dll的一個公共符號的dll我沒有來源?

回答

-1

他們不缺,你只是沒有配置符號路徑。 檢查下面的Microsoft KB,如果不工作,你可能有一個更古怪的問題。

的一種方式,以確保你的符號調試是LM命令。 沒有調試符號的輸出很可能是這樣的:

lm 
start end  module name 
01000000 01014000 notepad (no symbols)  
74720000 7476b000 MSCTF  (export symbols)  C:\WINDOWS\system32\MSCTF.dl 

Whilee輸出的流明與調試符號將是:

lm 
start end  module name 
01000000 01014000 notepad (pdb symbols)   e:\LocalSymbols\notepad.pdb\15800B8231AF4FDE85232D42B267D3E51\notepad.pdb 
+0

他認爲* *某些類型的列表中,這個手段他確實有這些符號。沒有它們,只有導出的符號可用。 – 2016-01-29 00:35:16

2

出現這種情況,也可以是實際上是相當令人沮喪的(雖然他們已經做了很好的清理工作了)。

可以將類型添加到現有的PDB,儘管它要求您有Visual C編譯器(可以從Visual Studio或WDK)。我概述的步驟在我這裏響應:

http://www.osronline.com/showthread.cfm?link=193747

我們正在使用的內核那裏,雖然你有相同的步驟。不同之處:

1)尋找NTDLL,而不是NT

2)你需要寫一個C文件與所需的結構的定義。

斯科特

+0

感謝您的回答! – avri 2010-12-28 11:08:46