【问题标题】:"Browse To Find Source" in Visual Studio 2010Visual Studio 2010 中的“浏览以查找源代码”
【发布时间】:2011-08-27 04:37:05
【问题描述】:

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

另外,我想启用它,以便我可以浏览到已经下载的源代码 来自http://referencesource.microsoft.com/ 的文件。

这将很有用,因为 Microsoft 并不总是在发布 PDB/source 代码及其最新补丁的同时发布。因此,例如,如果我想进入 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 或将虚拟机保留在手边,发布包含源代码的框架版本,然后禁用更新。

【问题讨论】:

  • “无法找到或打开 PDB 文件”消息可能会出现在加载的 DLL 旁边的模块加载输出窗格中,即使您知道 PDB 文件存在于 DLL 旁边。在这种情况下,只需对 DLL 进行清理并重新编译,通常 DLL 符号就会正确加载。我估计这是一个 VS 错误,因为无法强制包含 PDB 文件,并且使用 clean 选项是不直观的。
  • 导致我执行清理操作的原因是我注意到 PDB 文件上的时间戳从未更改,即使我重新编译并且即使我在编译之前删除了 PDB 文件。只有 clean 操作会导致重新生成 PDB 文件。

标签: c# .net visual-studio-2010 debugging pdb


【解决方案1】:

查看文章Step Into .NET Framework 4.0 Source Code

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

我希望这是关于您正在寻找的内容。

【讨论】:

  • 写这篇文章的人实际上并没有按照他在文章中所说的去做。如您所见,他在文章中提供的屏幕截图中也禁用了“Browse to source”。
  • 我认为您的设置有问题。尝试仔细检查它们。您是否尝试按照故障排除 (referencesource.microsoft.com/troubleshooting.aspx) 部分中描述的步骤进行操作?
【解决方案2】:

简介

当您从 Visual Studio 进行构建时,通常,除了可执行文件之外,您还会获得一个 PDB 文件。您可以在..bin\Debug..bin\Release 目录中看到此文件。 此 PDB 文件保留到程序集中的源代码行和可执行代码的映射。此外,用于构建的源代码文件的原始位置存储在 PDB 文件中。 这意味着如果你构建一个类库,它有一个位于G:\ClassLibrary\Class1.cs 的文件,这个路径将存储在ClassLibrary.pdb 中。 重要的是要记住,如果没有 PDB 文件,就不可能进行源代码步入式调试。

现实生活场景

所以,假设我在我的驱动器 G:\ClassLibrary1 上构建一个类库。

我给你一个ClassLibrary.dll 和一个ClassLibrary.pdb 文件,或者你通过从源代码管理中检出它们来获取它们。

您在项目中引用了ClassLibrary.dll,并使用了库中的一个类。

如果您现在尝试从库中单步执行类代码,将会发生以下情况:

Visual Studio 尝试定位 ClassLibrary.pdb 文件 in a couple of locations

  • 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 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 框架本身的源代码并且Microsoft 没有为源代码放置可用的PDB 文件,而是Microsoft 放置了一些不能用于步骤的PDB 文件,则经常会发生这种情况-在调试中。这种情况发生的频率比您想象的要多,因为 Microsoft 经常对 .NET Framework 源代码进行更新(补丁)。这些更新通过Windows Update 静默安装到您的计算机上,您惊讶地发现昨天可以调试 .NET Framework 源代码,而今天却不能。他们通常需要一些时间才能为最新代码放置一个有效的 PDB 文件。在这种情况下,您可以使用.NET Reflector Pro 步进调试功能或具有可用 PDB 文件的 .NET 框架版本的虚拟机,并在该计算机上禁用 Windows 更新。

【讨论】:

  • 那么启用对话框/链接的说明是什么?
  • @abatishchev 你不能启用它。如果你得到“没有可用的源代码”,你要做的第一步是右键单击顶部的调用堆栈指令,选择“符号加载信息”并确保在某处有“符号加载”消息。如果您没有看到任何“已加载符号”,那么您应该尝试将 pdb 放置在此处列出的位置之一。此外,pdb 必须在其中包含源行号信息。
  • 我的问题是我已经加载了符号(来自 MS 符号服务器的 System.Web - 我在模块窗口中看到),但菜单/对话框仍然被禁用
  • 如果是这种情况,那么 pdb Microsoft Symbol Server 为您提供的不包含源代码行号信息,因此它不能用于调试步进目的。您可以通过使用 dia2dump 查看 MS 给您的 pdb 内部来仔细检查这一点。不幸的是,由于补丁,这种情况经常发生。我知道的选项是:reflector pro,带有 .net 框架版本的 VM,其中有来自 MS 的良好 System.Web pdb 或从 referencesource.microsoft.com/netframework.aspx 下载 .net 源并查看它们(无需调试)。
  • 非常感谢您的澄清!
【解决方案3】:

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

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

更详细的解释可以在这里找到How to fix debugger is looking for executioncontext.cs

【讨论】:

    猜你喜欢
    • 2012-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-22
    相关资源
    最近更新 更多