26

Visual Studio 2010 中何时启用“浏览以查找源代码”?(见下文)

在此处输入图像描述

此外,我希望启用它,以便我可以从http://referencesource.microsoft.com/浏览到已经下载的源代码文件。

这将很有用,因为 Microsoft 并不总是与他们的最新补丁同时发布PDB /源代码。因此,例如,如果我想进入 DateTime,我真的不关心不涉及 DateTime 的最新补丁。我只想浏览我从http://referencesource.microsoft.com/下载的代码。

经过一番调查,我发现dia2dump是查看 PDB 文件内容的有用工具。(它在C:\Program Files (x86)\Microsoft Visual Studio 10.0\DIA SDK\Samples\DIA2Dump\

看起来当我看不到 DateTime 之类的源代码时,使用 .NET Framework 单步执行,mscorlib.pdb实际上会下载一个文件。

但是如果你用dia2dump查看它,它不包含源文件映射。换句话说,没用,因为即使您可以像我最初的想法一样浏览源代码,它也行不通,因为没有源文件映射,也没有函数的起始地址,并且缺少很多东西:(

我认为这里的解决方案是使用.NET Reflector Pro 或将虚拟机放在手边,并使用具有源代码的框架版本,然后禁用更新。

4

3 回答 3

29

介绍

每当您从 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 更新。
于 2011-05-18T16:28:52.750 回答
0

查看文章步入 .NET Framework 4.0 源代码

如果您遇到“No Source Available”屏幕,请尝试按“Browse to Find Source”并在源目录中找到您需要的文件。您可能需要使用文件搜索来找到它。这仅执行一次,因为从现在开始 Visual Studio 会记住此位置并在那里搜索丢失的源文件。

我希望这是关于你正在寻找的东西。

于 2011-05-17T13:32:01.157 回答
0

Visual Studio 2019 中的类似问题可以通过选中“仅启用我的代码”来解决。

调试>选项...>调试>常规>仅启用我的代码

在此处输入图像描述

更详细的解释可以在这里找到如何修复调试器正在寻找 executioncontext.cs

于 2020-08-20T16:05:56.783 回答