介绍
每当您从 Visual Studio 进行构建时,通常,除了可执行文件之外,您还会获得一个PDB文件。..bin\Debug
您可以在or..bin\Release
目录中看到此文件。此 PDB 文件保留到程序集中的源代码行和可执行代码的映射。此外,用于构建的源代码文件的原始位置存储在 PDB 文件中。这意味着,如果您构建一个有一个文件位于的类库,则G:\ClassLibrary\Class1.cs
此路径将存储在其中ClassLibrary.pdb
。从这一切中要记住的重要一点是,如果没有 PDB 文件,就不可能进行源代码逐步调试。
真实场景
所以,假设我在我的驱动器上构建G:\ClassLibrary1
一个类库。
我给你一个ClassLibrary.dll
和一个ClassLibrary.pdb
文件,或者你通过从源代码管理中检出它们来获取它们。
您ClassLibrary.dll
在项目中引用 并使用库中的类。
如果您现在尝试从库中单步执行类代码,将会发生以下情况:
Visual Studio 尝试在几个位置找到 ClassLibrary.pdb 文件
1.1 如果它没有找到它,你会得到一个“浏览查找源”禁用页面。请记住,如果没有有效的 PDB 文件,您将无法进行调试。
1.2 如果它确实找到了一个 PDB 文件,它会在 PDB 文件内部查看并发现您正在尝试调试Class1.cs
最初是从
G:\ClassLibrary1\Class1.cs
并在您的计算机上查找该文件。
1.2.1 如果找到,它会自动进入代码。
1.2.2 如果没有找到,会出现如下对话框:
如果您按取消,您将看到:“无可用来源”,在这种情况下,您将启用“浏览查找来源”。
为什么?因为你有一个有效的 PDB 文件,但 Visual Studio 不可能知道你的计算机上哪里有 ClassLibrary1 的源代码,甚至你的计算机上是否有它。这就是为什么您得到对话框 -> 以便您可以将 Visual Studio 指向源代码文件的确切位置。
最后的笔记
那么,当您通过浏览器查找源代码被禁用时,您会怎么做呢?
在 Visual Studio 中,打开菜单Debug -> Windows -> Call stack。
您右键单击顶部的 call stak 指令,然后选择“符号加载信息”。它将显示 Visual Studio 尝试查找有效 PDB 文件的位置。
- 1.a 如果您只看到“无法找到或打开 PDB 文件”消息,请将有效的 PDB 文件放在这些位置中的任何一个。(您可能需要向右滚动才能看到消息)停止并再次开始调试。
- 1.b 如果您看到“PDB 与图像不匹配”消息,则表示如下。Visual Studio 找到了一个 PDB 文件,但它是用于另一个构建的。如果我构建 ClassLibrary1.dll 并将其提供给您,然后在不更改任何代码行的情况下再次构建它,然后将 PDB 提供给您,您尝试调试
classLibrary1.dll
您将收到此消息。程序集及其 PDB 文件必须完全来自同一个版本,否则您将收到此消息。(每次您进行构建时,此检查都是使用在程序集和 PDB 文件中放入的一些唯一编号完成的)
- 1.c 您会看到“已加载符号”消息,但仍会禁用“浏览以查找”。这意味着您拥有的 PDB 文件不适合单步调试。您尝试使用的某些 PDB 文件中没有单步调试所需的所有信息。我认为您可以从高级构建设置中的某个地方控制它,但我还没有尝试过,因为我希望每次构建时都生成可用的 PDB 文件。如果您尝试调试.NET的源代码,通常会发生这种情况框架本身和微软没有为源代码放置可用的 PDB 文件,而是微软放置了一些不能用于步入调试的 PDB 文件。这种情况发生的频率比您想象的要多,因为 Microsoft 经常对 .NET Framework 源代码进行更新(补丁)。这些更新通过Windows Update静默安装到您的计算机上,您惊讶地发现昨天可以调试 .NET Framework 源代码,而今天却不能。他们通常需要一些时间才能为最新代码放置一个有效的 PDB 文件。在这种情况下,您可以使用.NET Reflector Pro 步进调试功能或具有带有可用 PDB 文件的 .NET 框架版本的虚拟机,并在该计算机上禁用 Windows 更新。