Visual Studio 2010中的"浏览到查找源"

Liv*_*foi 26 .net c# debugging visual-studio-2010 pdb

何时在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来保存虚拟机,使用源代码然后禁用更新的框架版本.

Liv*_*foi 27

介绍

每当从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文件

  • 1.1如果找不到,则会显示"浏览查找源"页面.请记住,如果没有有效的PDB文件,则无法进行调试.

  • 1.2如果确实找到了PDB文件,它会查看PDB文件并发现您正在尝试调试Class1.cs最初构建的文件

    G:\ClassLibrary1\Class1.cs
    
    Run Code Online (Sandbox Code Playgroud)

    并在您的计算机上查找该文件.

  • 1.2.1如果找到它,它会自动进入代码.

  • 1.2.2如果找不到,则会出现以下对话框:

浏览到源文件

如果按"取消",将显示"无可用来源",并且在这种情况下您将启用"浏览以查找源".

在此输入图像描述

为什么?因为您有一个有效的PDB文件,但Visual Studio无法知道您的计算机上ClassLibrary1的源代码在哪里,或者您是否在计算机上拥有它.这就是你得到对话框的原因 - >这样你就可以将Visual Studio指向源代码文件的确切位置.

最后的笔记

那么,当您进行浏览以查找源禁用时,您会做什么?

在Visual Studio中,打开菜单Debug - > Windows - > Call stack.

您右键单击顶部调用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 Update.