PDB文件PDB (程序数据库)或程序的基本数据是指VS编译链接时生成的文件,每个程序集(EXE或DLL )都有相应的PDB文件。 DPB文件主要包含VS调试器所需的基本信息,主要包括源文件名、变量名、函数名和相应的行号等。 由于存储了调试信息,PDB文件通常在调试模式下生成。 有了该文件,您可以在断点处调试程序,然后一步一步地运行程序。
为了直观地显示PDB文件的内容,做个小实验吧。 创建名为CrashMe的WPF程序,将按钮放置在主窗体上,并在按钮的Click事件处理方法中编写以下代码: 因为DataContext为空,所以MessageBox将弹出一个异常堆栈。
privatevoidcrashbutton _ onclick (对象发送器,布线事件) try{messagebox.show ) newwindow ).data context } cacaa }将生成的CrashMe.exe与CrashMe.pdb对齐后,显示的MessageBox内容如下图所示。 删除CrashMe.pdb文件后,内容如下图所示。
比较两幅图时,可以看到带有CrashMe.pdb的文件的位置和代码行号变多,这些信息记录在pdb文件中。
PDB文件包含哪些内容通过上一小节的例子,大家对PDB文件有了大致的了解,知道存储了代码行号等信息。 托管程序和非托管程序存储在PDB文件中的信息不同。 托管程序的元数据包含类型定义、函数签名等信息,因此PDB的内容相对较少。
本机c pdb包含public、private和static函数的地址全局变量的名称、地址参数和局部变量的名称,以及堆栈中的偏移class、structure和数据类型用于x86上的朴素堆栈的遍历源文件的名称和行号. NET PDB中包含的信息源文件名、行数本地变量的名称和行数PDB是私有文件格式,不能直接获取其内容。 只能通过微软提供的调试接口访问SDK访问。
每个PDB唯一性和重要性程序集(PE文件、EXE或DLL )都有相应的PDB文件,每个编译生成的PE\PDB文件都不同。 编译器将生成的GUID存储在PE\PDB文件中,并映射PE文件和PDB文件。 由于PDB文件是唯一的,因此PDB文件与PE文件同等重要,如果丢失,则无法通过重新编译获取。 注:即使是同一代码,在同一台计算机上编译时,生成的PDB每次都不同。 必须保存发布版本的PDB文件。
可以使用DumpBin.exe从PE文件中检索GUID信息,在控制台中启动程序,并传递PDB文件和/headers参数。 如以下控制台输出所示,其中的bbf 232 aa-7586-4659-b391-e 19b 0150 e69 f是该PE文件的GUID信息,并且还输出与其对应的PDB文件的位置。
d :\crash me\bin\debug dumpbin.exe crash me.exe/headers……debugdirectoriestimetypesizervapointer—— – { bbf 232 aa-7586-4659-b391-e 19b 0150 e69 f },1,c :\users\iron\desktop\crash me\obj\debug\crash me
调试工具按路径和名称搜索PDB文件,并在上面的GUID中确定PDB文件和PE文件是否真的匹配。
调试工具加载PDB文件的顺序:
PE文件路径PE中hardcode记录的构建目录。 例如,obj\debug\ *.pdb根据symbol server的设置, 在本地symbol server上的cache中在远程symbol server上搜索参考资料PDB文件详细信息- csdnpdbfiles 3360 whateverydevelopermustknowdumpbinreference-mshowtowtor gram数据库(pdb )文件- codeprojectsymbolsfilelocator-codeprojectconvertingamanagedpdbintoaxmlfile-MSS