如何启用“启用.NETFramework 源代码单步执行”?

更新于2013年2月22日 : Microsoft Connect 条目中有来自 Alok Shriram (程序管理器,基类库,。NET Framework) ,该问题现在应该得到解决。连接条目被标记为 Resolved (Fixed):

This issue should now be fixed. We published an update to reference sources. 如果你的问题还没有解决,请告诉我们。

一年半。

奖金链接

原始问题

如何在 VisualStudio2010中启用.NET 框架源单步执行?


注意 : 这个问题是一个更大的整体的一部分:


Visual Studio 2010增加了一个新功能:

  • 工具,选项,调试,常规,启用.NETFramework 源代码单步执行

Screenshot of options menu

按照 MSDN 页面 如何: 调试.NETFramework 源的说明:

启用.NETFramework 源调试

  1. 工具菜单上,单击 选择

  2. Options对话框中,单击 正在调试类别。

  3. 在“ 将军”框中,选中以下复选框:

    • Enable .NET Framework source stepping
    • 启用源服务器支持

我这样做:

Screenshot of options menu, highlighting the relevant options selected

注意 : 您将注意到,正如 MSDN 页面所注意到的,选中 启用.NETFramework 源代码单步执行将自动取消选中 * * Enable Just My Code (仅管理)。我还启用了源服务器支持的诊断消息。

启用这些选项会自动为我设置一个符号缓存下载位置:

Screenshot of options menu, showing cache directory (highlighted)

注意 : 微软符号服务器条目已经存在(不能删除)。


MSDN 页面说要加载这些符号:

使用“模块”窗口加载框架符号

  1. 模组窗口中,右键单击未加载其符号的模块。您可以通过查看 Symbols Status列来判断是否加载了符号。

  2. 指向 载入符号并单击 微软符号服务器从 Microsoft 公共符号服务器下载符号,或从以前存储符号的目录加载符号。

我试试这个:

enter image description here

然后所有的符号都被加载了:

Screenshot of modules window, as described above

I & rsquo; 一直坐在一个断点上,这个断点即将调用.NET 框架代码:

Screenshot of code, transcribed below

protected override void ScaleControl(SizeF factor, BoundsSpecified specified)
{
base.ScaleControl(factor, specified);

按下 F11会导致调试器直接跳到下一行:

Screenshot of code, transcribed below

protected override void ScaleControl(SizeF factor, BoundsSpecified specified)
{
base.ScaleControl(factor, specified);


//Record the running scale factor used
this.scaleFactor = new SizeF(
this.scaleFactor.Width * factor.Width,
this.scaleFactor.Height * factor.Height);

如何在 VisualStudio2010中启用.NETFramework 源单步执行?


我的代码正处于一个断点。我尝试双击调用堆栈中更上一层的一个函数。这将,我希望,允许我 jump到。NET 代码:

enter image description here

除了它不能工作: Visual Studio 告诉我没有可用的源代码:

Screenshot of error message saying No Source Available

如何在 VisualStudio2010中启用.NETFramework 源单步执行?


如果在尝试单步执行之前切换到反汇编视图。NET 代码(调试-> 窗户-> 拆卸) ,我可以看到一个 call进入。NET 代码:

Screenshot of code

当我这样做时,我最终调试了 System.Windows.Forms.ScaleControl的反汇编:

Screenshot of disassembly window

Which isn’t the same as, or as useful as, being able to step into the .NET Framework source.

如何在 VisualStudio2010中启用.NETFramework 源单步执行?


The configured symbol cache path on my computer does contain symbol cache files:

Screenshot of folder listing

So it is downloading pdb symbol files, but refusing to use them.

如何在 VisualStudio2010中启用.NETFramework 源单步执行?


Leppie suggested that I check the Debug log (with the debug log window open; otherwise it doesn’t log anything):

Step into: Stepping over method without symbols 'System.Windows.Forms.Form.ScaleControl'

在日志的前面,我看到它载入 System.Windows.Forms.dll的符号:

Loaded 'C:\Windows\assembly\GAC_MSIL\System.Windows.Forms\2.0.0.0__b77a5c561934e089\System.Windows.Forms.dll', Symbols loaded.

enter image description here

所以 找到了我的符号,却声称找不到。

如何在 VisualStudio2010中启用.NETFramework 源单步执行?


意大利微软公司的一位员工建议关闭 Require source files to exactly match original version:

Screenshot of options window

那也解决不了问题。

如何在 VisualStudio2010中启用.NETFramework 源单步执行?


有人认为微软的 .NET Framework 4.0源服务器存在 bug。根据这个建议,我将项目转向目标 .NET Framework 3.5:

enter image description here

That didn’t fix it.

如何在 VisualStudio2010中启用.NETFramework 源单步执行?


某个地方的某个人无所事事地想知道另一个人是否也遇到了同样的问题 was using the 64-bit version of the debugger。现在,没有64位版本的 Visual Studio,但是我尝试将我的项目从 中央处理器切换到 X86(它被 JITed 到 x64) ,以防微软不支持64位处理器:

enter image description here

但这并没有解决问题:

Step into: Stepping over method without symbols 'System.Windows.Forms.Form.ScaleControl'

如何在 VisualStudio2010中启用.NETFramework 源单步执行?


参见

32830 次浏览

我想我已经找到答案了。

我追踪了 Fiddler 上发生的事,似乎只有符号可用,没有来源。

当 VS 试图从“参考资源”服务器加载符号时,它失败了(404)。由于这个失败,我认为它不能映射到该服务器上的源文件。

Http://referencesource.microsoft.com/symbols/mscorlib.pdb/ed96a7f38a2940f39b9ca7ad9bc5cb671/mscorlib.pdb

在上面的故障之后,它尝试一些名为“ msdl”的服务器,在那里它可以找到实际的 PDB (但似乎这个服务器没有源代码信息)。

Http://msdl.microsoft.com/download/symbols/mscorlib.pdb/ed96a7f38a2940f39b9ca7ad9bc5cb671/mscorlib.pd_

总而言之,这似乎是微软服务器的一个(暂时的)问题。

我确信我以前有一些源代码,但是现在它不工作了。

编辑:

我尝试了不同的.NET 版本,结果都是一样的

现在,如果你已经安装了 SP1,它就不能工作了。这里有一些关于问题的评论表格 MS: http://social.msdn.microsoft.com/Forums/en-US/refsourceserver/thread/41388c7b-582b-4e3f-8178-3d38a3c99639

不幸的是,正如 Leppie 指出的那样,微软存在一个问题(我也得到了同样的结果)

应该注意的是,您的尝试无论如何都会失败,因为您提到:

  • 微软符号服务器

而不是:

  • referencesource.microsoft.com/symbols

请参阅 将 VisualStudio 配置为调试.NETFramework 源代码的 FAQ/疑难解答部分

你可在此找到参考资料,以供下载:

.NET Framework 4.0参考资料来源

WCF,WF,甚至4.5 Beta/RC 和更多的资源 也可以在那里找到:

参考资料网络框架

用于单步执行源代码的 PDB 只针对 RTM 和 ServicePack 发布。因此,当安全性更新出来并修改您正在尝试调试的 dll 时,它将导致源代码单步执行不工作(也就是说,您将得到“无源代码可用”和灰色的“浏览查找源代码”)。

However, once you've made all the appropriate settings, you can use the following workaround. The workaround is essentially to find the security updates that caused the dll to change, and then remove them. This has the obvious downside of having those security updates removed on your machine.

解决办法

  1. 确定要调试的 dll (例如 System.Windows.Forms.dll)
  2. 调试时,在 VisualStudio 中打开 模组窗口,找到 版本列。如果版本不是 RTM 或 ServicePack 版本,则需要执行工作流。通常 RTM dll 会说“由: RTMRel 构建”。作为安全更新的一部分的 dll 将显示“由: RTMGDR 构建”。请注意版本号(例如,由 RTMGDR 构建的4.0.30319.269)
  3. 现在,我们希望找到创建这个版本的更新。你可在 support.microsoft.com/kb/搜寻 dll 及版本号码 例如,我进行了以下谷歌搜索: site:support.microsoft.com/kb System.Windows.Forms.dll 4.0.30319.269
  4. 搜索应该会显示有关更新的信息。请注意地址栏中的 KB 号。在我的例子中,地址是 http://support.microsoft.com/kb/2604121,也就是 KB2604121,是我们感兴趣的。
  5. 转到控制面板-> 程序和功能,然后点击“查看已安装的更新”
  6. 查找列出 KB 号的更新(可以使用右上方框中的搜索)。
  7. 卸载更新。
  8. 对相同的 dll 重复这个过程,直到 dll 返回到 RTMRel 版本或 SP 版本。例如,对于 System。窗户。在返回到 RTMRel 版本之前,我必须删除 KB2686827、 KB2604121、 KB2518870。

您需要在您关心调试的.NET 框架中对每个 dll 执行此操作。

完成此操作后,在。Net source (例如,转到 Breakpoints 选项卡,说 New-> Break at Function,然后输入 System。窗户。表格。表格。表格) ,或进入其中一个。那个 dll 中的 net 方法。

如果要调试开放源代码(如 nuget 包) ,可以将此 URL 添加到符号服务器列表中

http://srv.symbolsource.org/pdb/Public

Http://www.symbolsource.org/public/home/visualstudio

这里是正式的指示 https://referencesource.microsoft.com/setup.html

配置 VisualStudio2013以调试.NET 框架

要配置 VisualStudio2013,请在“工具”中执行下列操作 - > 选项-> 调试-> 常规菜单:

  • 只关闭我的代码
  • 禁用属性和运算符上的步骤
  • 禁用要求源文件与原始版本完全匹配
  • 启用.NET 框架源代码单步执行
  • 启用源服务器支持

enter image description here

在我的例子中,我正在调试一个旧的 .NET 2.0 WinForms应用程序,我得到了 “来源不可用”消息。我试了所有推荐的设置。

最终,我重新构建了这个应用程序,暂时将 .NET 4.5作为目标,并能够让源代码单步执行工作。也许我的应用程序已经过时了,无法进行源代码步骤。我知道,这有点违背初衷,但对于快速而肮脏的测试,它是有效的。我的错误仍然存在于 .NET 4.5。:)

Target Framework

使用 dotPeek 作为符号服务器对我来说很有用。(4.6.2框架)(我做了这个线程中提到的所有事情,没有工作,安全更新没有找到... 等)

Https://hmemcpy.com/2014/07/how-to-debug-anything-with-visual-studio-and-jetbrains-dotpeek-v1-2/

JetBrains dotPeek 反编译实际的.NET DLL,然后托管一个符号服务器,您可以从 VisualStudio 中下载符号。 经过一个相当缓慢的下载,然后重新启动 VS,我能够断点和步骤进入代码。