浏览以查找源代码 - 在 Visual Studio 2010 中

26
在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 stepping,实际上会下载一个mscorlib.pdb文件。

但是如果你用dia2dump打开它,它不包含源文件映射。换句话说,它是无用的,因为即使你像我最初的想法那样浏览源代码,也不会起作用,因为没有源文件映射和函数的起始地址,还有很多东西都缺失了 :(

我认为这里的解决方案是使用.NET Reflector Pro或者准备一个虚拟机,其中包含有源代码的框架版本,然后禁用更新。


“无法找到或打开PDB文件”消息可能会出现在模块加载输出窗格旁边的已加载DLL中,即使您知道PDB文件就在DLL旁边。在这种情况下,只需对DLL进行清理、重新编译,通常DLL符号将正确加载。在我看来,这是一个VS的bug,因为没有办法强制包含PDB文件,并且使用清理选项是不直观的。 - rtischer8277
我进行清理操作的原因是我注意到即使重新编译,甚至在编译之前删除PDB文件,时间戳也从未更改。只有清理操作才会导致重新生成PDB文件。 - rtischer8277
3个回答

29

介绍

每当您从Visual Studio进行构建时,通常还会获得一个PDB文件,除了可执行文件。您可以在..bin\Debug..bin\Release目录中看到此文件。 此PDB文件保留了您的源代码行和汇编中可执行代码之间的映射。此外,存储了构建所使用的源代码文件的原始位置。 这意味着,如果您构建了一个类库,其中单个文件位于G:\ClassLibrary\Class1.cs,则该路径将存储在ClassLibrary.pdb中。 重要的是要记住,没有PDB文件,无法进行源代码逐步调试。

实际场景

因此,假设我在驱动器G:\ClassLibrary1上进行了类库的构建。

我给您一个ClassLibrary.dll和一个ClassLibrary.pdb文件,或者您通过检出它们来获取它们。

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

如果您现在尝试从库中进入类代码,则会发生以下情况:

Visual Studio尝试在几个位置中定位ClassLibrary.pdb文件

  • 1.1 If it doesn't find it, you get a "Browse to find source" disabled page. Remember, you can't debug without a valid PDB file.

  • 1.2 If it does find a PDB file, it looks inside the PDB file and sees that you are trying to debug Class1.cs which was originally built from

    G:\ClassLibrary1\Class1.cs
    

    and looks on your computer for that file.

  • 1.2.1 If it finds it, it steps into the code automatically.

  • 1.2.2 If it doesn't find it, you get the following dialog:

Browse to source file

如果您按下取消按钮,将会出现“无法找到源代码”提示,并且在这种情况下,“浏览以查找源代码”选项将被启用。

Enter image description here

因为您有一个有效的PDB文件,但是Visual Studio不可能知道您计算机上ClassLibrary1的源代码在哪里,或者您是否在计算机上拥有它。这就是为什么会出现对话框,以便您可以指向Visual Studio源代码文件的确切位置。
最后注意事项:
当您无法浏览查找源代码时,您需要在Visual Studio中打开菜单Debug->Windows->Call stack。右键单击顶部调用堆栈指令,然后选择“符号加载信息”。它将显示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文件,而是提供了一些无法进行逐步调试的PDB文件,则经常会发生这种情况。这比您想象的更常见,因为Microsoft经常对.NET Framework源代码进行更新(补丁)。这些更新通过Windows Update悄悄地安装到您的计算机上,您会惊讶地发现昨天您可以调试.NET Framework源代码,而今天却不能。通常需要一些时间,直到他们为最新代码提供有效的PDB文件。在这种情况下,您可以使用.NET Reflector Pro逐步调试功能或具有带有可用PDB文件的.NET框架版本的虚拟机,并在该机器上禁用Windows Update。

那么,哪些指令可以启用对话框/链接? - abatishchev
@abatishchev 你不能启用它。如果出现“无可用源代码”的情况,第一步是右键单击顶部调用堆栈指令,选择“符号加载信息”,确保在那里有“已加载符号”的消息。如果您没有看到任何“已加载符号”,那么您应该尝试将pdb放置在其中一个列出的位置。此外,pdb必须具有其中的源行号信息。 - Liviu Trifoi
我的问题是,我已经加载了符号(来自MS Symbols Server的System.Web符号 - 我在模块窗口中看到了它),但菜单/对话框仍然被禁用。 - abatishchev
如果是这种情况,那么pdb Microsoft符号服务器提供的内容不包含源代码行号信息,因此无法用于调试步进目的。您可以使用dia2dump来检查MS提供的pdb文件。不幸的是,由于补丁的原因,这种情况经常发生。我知道的选项有:反编译器Pro、带有良好System.Web pdb的.NET框架版本的VM,或从http://referencesource.microsoft.com/netframework.aspx下载.NET源代码并查看其中的内容(无需调试)。 - Liviu Trifoi

0

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

如果你遇到“无法获得源代码”的屏幕,请尝试按“浏览以查找源代码”并在源目录中找到所需的文件。您可能需要使用文件搜索来查找它。 这只需要做一次,因为从现在开始Visual Studio会记住此位置并在其中搜索缺失的源文件。

希望这是你要找的内容。


3
文章作者实际上没有做他在文章中所说的事情。正如你所看到的,在他提供的截图中,“浏览源代码”也被禁用了。 - Liviu Trifoi
我觉得你的设置有些问题。请尝试仔细检查一下。你是否尝试按照故障排除(http://referencesource.microsoft.com/troubleshooting.aspx)部分中描述的步骤进行操作了? - Renatas M.

0

在 Visual Studio 2019 中类似的问题可以通过勾选"启用仅调试我的代码"来解决。

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

enter image description here

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接