如何使用符号服务器?(以及为什么您真的希望这样做...)
如何设置.NET符号服务器并在没有源代码的情况下启用生产环境调试
引言
在处理某个项目时,我们遇到一个问题,即一些基础结构代码与我们的解决方案分离,并被封装到一个类似第三方 DLL 的东西中。问题是,在尝试调试此外部 DLL 时,调试器会尝试在特定路径中查找源代码 – 即编译时原始源代码所在的路径。
这显然是个大问题
- 当与不同地区的团队合作时,每个团队都在处理相同的代码,但每个团队都在使用不同的开发服务器
- 在生产环境中 – 您希望能够在不依赖源代码初始位置的情况下,使用源代码调试您的应用程序
本文将重点介绍如何创建 PDB 对象,即编译器用于调试和查找源代码的对象。从某种意义上说,它将从源代码控件(TFS)而不是源文件中查找源代码。您会发现这些步骤非常容易遵循(特别是如果您已经拥有 TFS 和构建配置),因此您可以立即在您的项目中实施它们。
本文是关于此主题的许多其他有趣文章的汇编(请参阅末尾的资源部分)。它旨在简短明了,以最少的努力帮助您的项目变得更“可调试”。
非常感谢所有文章的作者 – John Robbins、Cameron Skinner 和 Ed Blankenship。
背景
John Robbins 已经在其必读的 文章 中详细介绍了 PDB 文件是什么以及调试器如何查找 PDB 文件。
总而言之,PDB 包含调试器用于执行其工作的信息。.NET PDB 包含两部分信息:源文件名及其行号,以及局部变量名。其余数据已包含在 .NET 元数据中(例如,公共、私有和静态地址、全局变量名和地址等)。
调试器使用文件名和嵌入在 PDB 文件和二进制文件中的 GUID 来查找正确的 PDB 版本。
Using the Code
为了启用源代码控件 PDB,您需要遵循以下步骤
- 为您的项目创建一个公共构建定义(我不会在本文中详述公共构建定义的通用细节,但您可以在 这里 查找它(查找 Build support 部分)。
- 创建一个共享文件夹,用作发布文件夹。发布文件夹是公共构建放置 DLL 和 PDB 的地方。这些 DLL 将在您的代码中引用。
- 创建一个共享文件夹,用作您的符号服务器。符号服务器是一个集中的地方,您的 PDB 文件以及所需的源代码信息将驻留在此处。
- 更新定义以使用发布位置文件夹
- 更新定义并设置发布符号的路径。此步骤执行两项操作 – 将 PDB 位置设置到符号服务器,以及执行称为源索引的操作,该操作创建源代码和源代码版本之间的映射。为此,只需在此处复制您的符号服务器 UNC 路径即可
- 就是这样 – 您已完成公共构建的定义。现在您需要实际构建它,并准备好您的客户端使用符号服务器。
现在,如何使用符号服务器进行调试?
- 确保从发布位置引用 DLL。您不必直接引用发布位置,可以将其复制到任何您喜欢的文件夹。请确保将外部 DLL 和 PDB 与您的解决方案一起检入。
- 在 VS 中,转到 DebugàOptions and Settings .... 这将打开设置对话框中的调试部分。
- 转到“Symbols”选项,然后添加您的符号服务器(请注意,您可能有多个符号服务器,每个项目一个,或者一个集中式的)。为此,只需点击屏幕顶部的文件夹图标即可。最后,它应该看起来像
- 转到“general”选项,并确保启用源服务器支持
- 现在,您就可以调试您的第三方代码,而无需访问源代码。调试时,当您逐行执行第三方代码时,您将看到以下对话框
上述消息将出现在调试器需要查找每个新文件的位置。如果您不喜欢这样,请创建一个名为 *SRCSRV.ini* 的文件,将其放置在 *<Visual Studio Install Directory>\Common7\IDE* 文件夹中,并填入以下文本
[trusted commands]
tf.exe=<Visual Studio Install Directory>\Common7\IDE\tf.exe
就是这样!
关注点
请注意,如果您遵循这些步骤,您实际上不需要将 PDB 文件与您的代码一起部署。TFS 会在 DLL 文件和匹配的 PDB 文件中嵌入唯一的 GUID。使用符号服务器和上述信息,调试器就知道去查找正确的 PDB。
很酷,对吧?
资源
- 开发人员需要了解的 PDB 相关知识
- 如何配置您自己的符号服务器以及如何在生产环境中调试
- 如何在 VS 中设置符号服务器
- 如何禁用源文件对话框
- PDB、TFS 和保留策略
- 硬核符号服务器
历史
- 2012年1月12日 - 第一次修订
- 2012年1月13日 - 添加了资源