pdb符号库文件详解

Posted dvlinker

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了pdb符号库文件详解相关的知识,希望对你有一定的参考价值。

目录

1、概述

2、Windbg和IDA反汇编工具要用到pdb文件

3、Process Explorer和Process Monitor也要用到pdb文件

4、pdb时间戳与pdb文件名称

5、Windbg中pdb符号文件路径配置


C++软件异常排查从入门到精通系列教程(专栏文章列表,欢迎订阅,持续更新...)https://blog.csdn.net/chenlycly/category_11397492.html       我们在使用工具去分析C++软件异常时,需要用到pdb文件。不仅Windbg和IDA反汇编工具需要用到pdb文件,有时使用Process Explorer和Process Monitor也会用到pdb文件,今天我们就来详细讲述一下pdb的相关内容。

1、概述

       PDB-Program Databse File,程序数据库文件,存放了二进制文件中所有函数及变量的符号,还有一些调试用的信息,要查看完整的函数调用信息及变量信息,都需要用到pdb文件。pdb文件是在编译工程时产生的,它是和对应的模块(exe或dll)一起生成出来的。在Visual Studio中,不管是Debug还是Release下默认都会生成pdb文件,相关的配置选项如下:

       本地程序之所以能调试,是因为其二进制文件中在本地编译生成时会自动写入对应的pdb文件的绝对路径,而pdb文件中存放着用于调试的各种调试信息,启动调试时调试器会根据文件中记录的pdb文件路径去加载pdb文件,去获取pdb文件中的调试信息。如果手动将pdb删除,在没有重新生成的情况下,肯定是无法调试的。

2、Windbg和IDA反汇编工具要用到pdb文件

       Windbg和IDA都需要使用pdb文件。

       Windbg要查看函数调用堆栈中的具体的函数及变量信息,所以需要使用到pdb文件。需要在windbg中去手动配置pdb文件的路径。IDA反汇编工具在打开二进制文件解析汇编代码时,如果有pdb文件,会显示具体的函数名,也会根据pdb中的调试信息在汇编代码中添加一些注释(有了这些注释,有利于阅读汇编代码)。

       对于IDA,只需将pdb文件放置在目标二进制的同级目录中,IDA会从目标二进制文件所在的目录中搜索对应的pdb文件,去自动加载。

3、Process Explorer和Process Monitor也要用到pdb文件

       除了Windbg和IDA之外,Process Explorer和Process Monitor两个工具有时也需要使用到pdb文件。比如在双击条目查看线程的函数调用堆栈时,如果有pdb文件,函数调用堆栈中会显示详细的函数名称,这样更有利于查看。对于这两个工具,和IDA一样,只需要将pdb文件放在目标程序的统计目录中,工具会去自动加载。

4、pdb时间戳与pdb文件名称

       在使用pdb文件时,有两点需要注意一下,一个是pdb文件的时间戳,一个是pdb文件的名称。
加载pdb文件时会严格校验pdb文件的时间戳(就是生成pdb文件的时间),必须要和二进制文件完全一致。即使是同样的代码,没有修改任何代码,在不同时间点编译生成的pdb文件,也是不能交叉使用的。

       pdb文件的名称必须和工程的名称一致,否则也是无法加载的。比如某个工程名称为videocodec_hp.vcxproj,生成的pdb文件的名称默认应为videocodec_hp.pdb(不区分大小写的),但在执行文件拷贝时将文件名称改成videocodec.pdb,这种情况下Windbg也是无法加载的。必须手动将文件名改成工程名后,才能正常加载。

这个问题我们遇到过几次,就是因为pdb文件名称与工程名称不一致导致的。

5、Windbg中pdb符号文件路径配置

       点击Windbg菜单栏中的File -> Symbol File Path ...,打开设置pdb文件路径的窗口,如下所示:

一般我们设置如下格式的pdb组合文件路径

C:\\Users\\Administrator\\Desktop\\pdbdir;srv*f:\\mss0616*http://msdl.microsoft.com/download/symbols

这么个一长串组合路径主要由下面三个路径构成:(路径之间使用分号隔开)

1)应用程序库pdb文件路径(非系统库)

C:\\Users\\Administrator\\Desktop\\pdbdir。我们开发的模块的pdb文件集中拷贝到该路径中,路径名称可以随意选择。

2)本地安装的Windows系统库pdb文件路径

f:\\mss0616,可以到微软官网上下载和Windows系统一致的系统符号库安装包,这个路径就是本机上安装系统pdb的路径。此时安装的系统pdb库是与我们当前系统对应的pdb,但在分析崩溃时dump文件是在在其他机器上产生的,对应模块的pdb是其他机器上安装系统的pdb,那我们本地安装的pdb就用不上了。现在微软官方已经取消了系统pdb文件的下载,统一使用下面给出的微软提供的在线系统pdb服务器地址。

3)Windows系统库在线下载路径

http://msdl.microsoft.com/download/symbols,这是微软提供的在线系统pdb文件下载服务器,如果设置了该地址,Windbg会自动连接该服务器,去自动下载与当前dump文件中用到的系统库版本一致的pdb文件。但这里需要注意一下,有时微软这个服务器会有连接不上或卡顿的情况,会直接导致windbg卡顿。所以遇到windbg比较安顿的时候,可以先将该地址删除掉。但有时我们需要设置该在线地址,因为有时我们想去看到底是调用了系统库中的那个接口出发的崩溃。

CSDN 社区图书馆,开张营业! 深读计划,写书评领图书福利~

以上是关于pdb符号库文件详解的主要内容,如果未能解决你的问题,请参考以下文章

Windbg调试工具使用详解,干货满满!

如何更改符号文件 (pdb) 中源文件的位置

获取pe文件调试符号文件pdb路径

PDB文件详解

CLR 如何定位 pdb 符号文件

Xamarin 和 Xamarin 表单的符号包(PDB 文件)