是否可以在windbg调试会话中向公共符号添加缺少的符号?

时间:2010-11-25 14:33:08

标签: windows debugging windbg

我试图在windbg中使用'dt'命令查看IMAGE_DOS_HEADER结构:

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的结构我怎么能添加符号我没有来源?

3 个答案:

答案 0 :(得分:2)

这种情况发生,实际上可能非常令人沮丧(尽管他们已经很好地清理了很多这些)。

可以向现有PDB添加类型,但它要求您具有可用的Visual C编译器(来自Visual Studio或WDK)。我在这里概述了我的回答中的步骤:

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

我们在那里使用内核,尽管你有相同的步骤。差异将是:

1)寻找ntdll而不是nt

2)您需要编写一个C文件,其中包含您想要的结构定义。

-Scott

答案 1 :(得分:0)

您还可以查看此主题,了解如何将类型添加到

http://www.woodmann.com/forum/showthread.php?10295-Mysteries-of-win32k-amp-GDI&p=72632&viewfull=1#post72632

发布#21

答案 2 :(得分:-1)

他们没有丢失,你只是没有配置你的符号路径。 检查以下Microsoft KB,如果这不起作用,则可能会出现奇怪的问题。

确保使用符号进行调试的一种方法是使用lm命令。 没有调试符号的输出可能如下所示:

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

使用调试符号的lm输出将是:

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