当前位置:网络安全 > [与调试] PDB 文件:每个开发人员必须了解的内容

[与调试] PDB 文件:每个开发人员必须了解的内容

  • 发布:2023-09-29 06:47

PDB 文件:每个开发人员必须了解的内容

一 什么是 PDB 文件

大多数开发人员应该知道 PDB 文件用于帮助调试软件。但它到底是如何运作的,我们可能并不熟悉。本文介绍 PDB 文件的存储和内容。还描述了调试器如何找到binay对应的PDB文件,以及调试器如何找到binay对应的源代码文件。本文适用于所有本机和托管开发人员。

在开始之前,我们首先定义两个术语:私有构建,用于表示在开发人员自己的机器上生成的构建;公共构建,用于表示在公共构建机器上生成的构建。私有构建相对简单,因为 PDB 和 binay 在同一个地方。通常我们遇到的问题都是关于公共构建的。

所有开发人员需要知道的最重要的事情是“PDB 文件与源代码一样重要”。如果没有 PDB 文件,您甚至无法进行调试。对于公共构建,符号服务器需要存储所有 PDB。那么当用户报错时,调试器可以自动找到binay对应的PDB文件。 Visual Studio 和 Windbg 都知道如何访问符号服务器。在将PDB和binay存储到符号服务器之前,需要对PDB操作进行源索引。源索引的作用是将PDB与源关联起来。

下一部分假设符号服务器和源服务器索引已设置。新版本的源索引和符号服务器复制可以在 TFS2010 中轻松完成。

2 PDB文件的内容

正式开始PDB的内容。 PDB 不是公共文件格式,但 Microsoft 提供了 API 来帮助从 PDB 获取数据。

原生 C++ PDB 包含以下信息:
* 公共、私有和静态函数的地址;
* 全局变量的名称和地址;
* 参数和局部变量堆栈上的名称和偏移量;
* 类、结构体和数据的类型定义;
* 帧指针省略数据,用于x86上的本机堆栈遍历;
* 源代码文件的名称和行号;

.NET PDB 仅包含 2 部分信息:
* 源代码文件名和行号;
* 和局部变量名;
* 所有其他数据已包含在.NET元数据中;

三 PDB 的工作原理

当您将模块加载到进程的地址空间时,调试器使用2中的信息来查找相应的PDB文件。第一个无疑是文件名。如果 zzz.dll 已加载,调试器将搜索 zzz.pdb 文件。在文件名相同的情况下,调试器还通过在PDB和binay中嵌入GUID来确保PDB和binay的真实匹配。因此,即使没有任何代码修改,昨天的 binay 和今天的 PDB 也无法匹配。您可以使用 dempbin.exe 查看二进制文件的 GUID。

您可以在 VisualStudio 的模块窗口的符号文件栏中查看 PDB 的加载顺序。搜索的第一个路径是二进制文件所在的路径。如果不在二进制文件所在路径中,则搜索二进制文件中硬编码记录的构建目录,例如 obj\debug\*.pdb。如果在上述两个路径中都没有找到PDB,则根据符号服务器的设置在本地符号服务器的缓存中查找。如果本地符号服务器的缓存中没有对应的PDB,则最终到远程符号服务器中查找。从上面的搜索顺序,我们可以看出为什么公共构建和私有构建的PDB搜索不冲突。

对于私有构建,有时当我们需要在其他人的机器上调试时,我们需要将相应的PDB与二进制文件一起复制。对于添加到 GAC 的 .NET 二进制文件,我们需要将 PDB 文件复制到 C:\Windows\assemble\GAC_MSIL\Example 类似 \1.0.0.0__682bc775ff82796a 的二进制文件所在目录。另一种解决方法是定义环境变量 DEVPATH 以将二进制文件放入 GAC,而不是使用 GACUTIL 命令。定义DEVPATH后,只需要把二进制文件和PDB放到DEVPATH的路径下即可。 DEVPATH 下的二进制文件相当于 GAC 下的二进制文件。要使用DEVPATH,首先需要创建一个目录并为当前构建用户拥有写入权限,然后使用刚刚创建的目录的值创建环境变量DEVPATH,然后在web.config、app.config或machine中启用开发模式.config,并开始修改DEVPATH的使用






开机后开发模式下,如果DEVPATH没有定义或者路径不存在,程序启动时会引发“Invalid value forregistry”异常。并且如果在 machine.config 中启用 DEVPATH 的使用,它将影响所有其他程序,因此请谨慎使用 machine.config。

开发人员需要了解的最后一件事是源代码信息如何存储在 PDB 文件中。对于公共构建,运行源索引工具后,版本控制工具会将代码存储在您设置的代码缓存中。对于私有构建,仅存储 PDB 文件的完整路径。例如c:\foo下的源文件mycode.cpp,pdb文件存放的路径为c:\foo\mycode.cpp。对于私有构建,可以使用虚拟磁盘来增加PDB对绝对路径的依赖。比如可以使用subst.exe将源代码路径挂载为V:,在别人机器上调试时也挂载V:。

结束!

谢谢!

作者:iTech
来源:http://www.sychzs.cn/
本文版权归作者iTech所有。转载时请注明作者署名及出处。不得用于商业用途,否则追究法律责任!

相关文章

热门推荐