Stamp of Software Debugging
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
navigation bar seprate line
写作花絮

解读PDB文件的魔码(Magic Code)——表25-6来之不易

PDB是Windows系统中使用最多的符号文件格式。最先是由Visual C++的始祖Visual C++ 1.0引入的,时间大约为1992年。

PDB文件的内部格式是不公开的。总的来说,PDB文件是二进制格式。但是有趣的是,在它的起始处总是有一段可读的文本信息。可以用type命令或者任何文本文件编辑器来观察这段内容,比如使用Type命令可以观察到:

c:\dig\dbg\author\code\bin\Debug>type kdtalker.pdb

Microsoft C/C++ program database 2.00

上面显示的这句话被称为PDB签名,它位于每个PDB文件的最开始处,以0x1A结束。因为0x1A在ASCII码中代表文本文件的结束,所以Type命令遇到这个字符后就会停下来,不会再继续显示后面的二进制内容。

如果使用记事本打开,那么可以看到下图所示的景象:

 

可见除了Type命令显示的签名外,后面还有两个可读的ASCII码,即第二行的JG。这个JG代表什么呢?事实上,它就是我们要说的PDB魔码(Magic Code)。它紧跟在PDB签名后面,长度为四个字节。

上面的PDB文件是VC6产生的,被称为PDB2.0,如果观察VS 2003/2005/2008产生的PDB7.0的文件,那么会发现它的PDB魔码为DS。

为了理解PDB魔码的含义,我开始了艰苦的搜索。搜索很久后,仍一无所获。关于PDB内部格式的文章实在是少。仔细阅读了《Undocumented Windows 2000 Secrets》,也没有答案。但是在搜索的过程中,我发现了Andy Penell的博客。他在名为《“PDB过时了”意味着什么》的短文中介绍了PDB签名。

http://blogs.msdn.com/andypennell/archive/2005/12/09/502267.aspx

读了这篇短文,我立刻意识到Andy可能是给我答案的专家。于是我在这篇博客的评论中先向他提了一个问题,并随便提到DS:

Monday, April 23, 2007 11:11 PM by Raymond Zhang

Andy, could you advise what does MSF mean in the signature. As I know, the signaure is followed by DS.

Andy很快就回复了,对MSF的解释与我猜测的相同。最重要的是他把我暗带的问题也回答了,令我喜出望外:

Tuesday, April 24, 2007 12:08 PM by andypennell

MSF stands for "Microsoft Stream Format" I believe. DS is Dan Spalding, who owned the linker and much of the PDB code for many years before retiring. RS is the other initial in the newer PDB header, Richard Shupak, who also had a substantial hand in this area. Well in many areas at MS in fact. He is in MS Research.

哦,原来DS代表Dan Spalding!这可是微软编译器团队无人不知,甚至在整个编译器领域都赫赫有名的大人物。有人称他为“father of the Microsoft linker”,也有人直接将他称为“Linker God”。Dan在微软工作18年后,于2005年2月退休。

在知道了DS的含义后,我又向Andy询问PDB2使用的JG魔码的含义,Andy回答说不清楚。后来我在一个偶然的机会知道JG代表Jan Gray,微软开发工具团队的另一个元老级人物。
当我通过电子邮件向Jan Gray求证JG魔码的含义时,他非常迅速的恢复了,并自豪地承认自己是PDB的发明者。在电话中,他兴致勃勃地给我讲述了发明PDB格式的缘起,PDB的早期历史,以及关于PDB文件一些有趣细节。例如,他纠正了MSF的含义是Multi-Stream Format的缩写,并非是Microsoft Stream Format。

navigation bar seprate line
Copyright (C) 2008-2013 Raymond Zhang, All Rights Reserved