Visual Studio 2010中的“浏览到查找源”

时间:2011-05-17 12:02:54

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

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

Enter image description here

此外,我想启用它,以便我可以浏览已经下载的源代码 来自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来保存或保留虚拟机,包含源代码的框架版本,然后禁用更新。

3 个答案:

答案 0 :(得分:26)

简介

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

现实场景

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

我为您提供了ClassLibrary.dllClassLibrary.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如果找不到,则会出现以下对话框:

Browse to source file

如果按“取消”,您将看到:“没有可用的来源”,在这种情况下您将启用“浏览查找源”。

Enter image description here

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

答案 1 :(得分:0)

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

  

如果遇到“No Source Available”屏幕,请尝试按“浏览查找源”并在源目录中找到所需的文件。您可能应该使用文件搜索来查找它。   这只执行一次,因为从现在起,Visual Studio会记住此位置并在那里搜索缺少的源文件。

我希望这是关于你在寻找什么。

答案 2 :(得分:0)

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

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

enter image description here

更多详细说明,请参见How to fix debugger is looking for executioncontext.cs