c# - Visual Studio 2010 中的 "Browse To Find Source"

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

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

Enter image description here

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

这会很有用,因为 Microsoft 并不总是发布 PDB/source code 与他们的最新补丁同时进行。因此,例如,如果我想进入 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支持或保留虚拟机,并发布具有源代码的框架,然后禁用更新。

最佳答案

介绍

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

真实场景

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

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

您引用了 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 -> 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 文件中没有包含逐步调试所需的所有信息。我认为您可以从高级build设置中的某个位置控制它,但我还没有尝试过,因为我希望每次构建时都生成可用的 PDB 文件。如果您尝试调试 .NET 的源代码,这种情况经常发生。框架本身,微软并没有为源代码放置可用的PDB文件,而是微软放置了一些不能用于逐步调试的PDB文件。这种情况发生的频率比您想象的要高,因为 Microsoft 经常对 .NET Framework 源代码进行更新(补丁)。这些更新通过 Windows Update 静默安装到您的计算机上,您会惊讶地发现,昨天您可以调试 .NET Framework 源代码,而今天却不能。通常需要一些时间才能为最新代码放置有效的 PDB 文件。在这种情况下,您可以使用 .NET Reflector专业的逐步调试功能或具有 .NET 框架版本和可用 PDB 文件的虚拟机,并在该机器上禁用 Windows 更新。
  • 关于c# - Visual Studio 2010 中的 "Browse To Find Source",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6030474/

    相关文章:

    c++ - 如何在 Visual Studio C++ 中将 GIF 显示为启动画面

    c# - ReferentialConstraint 中的依赖属性映射到存储生成的列

    c# - 如何使用 C# 控制台在 Sharepoint 2010 中上传文件

    c# - xml处理过程中的异常

    php - "vertical"正则表达式匹配 ASCII "image"

    visual-studio-2010 - 条件编译不起作用

    c# - 在 Winform 的组合框中获取旧的选定索引

    c# - 在哪里放置验证逻辑?在服务或存储库中?

    c# - 更改文本框的边框颜色

    visual-studio-2010 - Visual Studio 2010 设计器错误 : Unable to copy from obj\debug to bin\debug