介绍
每当您从 Visual Studio 进行构建时,通常,您还会得到一个PDB http://en.wikipedia.org/wiki/Program_database除了可执行文件之外的文件。您可以在以下位置看到该文件..bin\Debug
or ..bin\Release
目录。
此 PDB 文件保留到程序集中的源代码行和可执行代码的映射。此外,完成构建的源代码文件的原始位置存储在 PDB 文件中。
这意味着如果您构建一个类库,其中有一个文件位于G:\ClassLibrary\Class1.cs
,该路径将被存储在里面ClassLibrary.pdb
。
重要的是要记住,如果没有 PDB 文件,就不可能进行源代码单步调试。
现实生活场景
所以,假设我在我的驱动器上进行构建G:\ClassLibrary1
,对于类库。
我给你一个ClassLibrary.dll
and a ClassLibrary.pdb
文件,或者您可以通过从源代码管理中检出它们来获取它们。
您参考的是ClassLibrary.dll
在您的项目中,您使用库中的类。
如果您现在尝试从库中单步执行类代码,将会发生以下情况:
Visual Studio 尝试查找 ClassLibrary.pdb 文件在几个地点 http://www.wintellect.com/CS/blogs/jrobbins/archive/2009/05/11/pdb-files-what-every-developer-must-know.aspx
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 -> 调用堆栈.
您右键单击顶部的调用 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 http://en.wikipedia.org/wiki/.NET_Framework框架本身和微软并没有为源代码放置可用的PDB文件,而是微软放置了一些不能用于单步调试的PDB文件。这种情况发生的频率比您想象的要高,因为 Microsoft 经常对 .NET Framework 源代码进行更新(修补)。这些更新通过以下方式静默安装到您的计算机上Windows更新 http://en.wikipedia.org/wiki/Windows_Update,您会惊讶地发现昨天您可以调试 .NET Framework 源代码,而今天却不能。他们通常需要一些时间才能为最新代码放置有效的 PDB 文件。在这种情况下你可以使用.NET反射器 http://en.wikipedia.org/wiki/.NET_Reflector专业的逐步调试能力或具有 .NET Framework 版本且包含可用 PDB 文件的虚拟机,并在该计算机上禁用 Windows 更新。