2010-11-25 21 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