如何启用“启用 .NET Framework 源单步执行”?

Posted

技术标签:

【中文标题】如何启用“启用 .NET Framework 源单步执行”?【英文标题】:How do you enable "Enable .NET Framework source stepping"? 【发布时间】:2011-12-29 16:04:40 【问题描述】:

2013 年 2 月 22 日更新:Microsoft Connect 条目有来自 Alok Shriram(项目经理、基类库、.NET 框架)的说明,现在应该解决该问题。 Connect 条目被标记为 Resolved (Fixed)

这个问题现在应该已经解决了。我们发布了对参考来源的更新。 如果您的问题仍未解决,请告知我们。

一年半。

奖励链接

Vote that this bug be fixed on Microsoft Connect.

Thread on Microsoft Social that has been going for a year and a half, asking when it will be fixed.

原始问题

如何在 Visual Studio 2010 中启用 .NET 框架源代码步进?


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

.NET 2.0 WinForm: Supporting DPI and Default Font Changes 在 ScaleControl 期间 WinForms 控件不缩放 VS2010:如何启用“启用 .NET Framework 源步进”? Visual Studio 2010 Professional: How to access Modules window? Visual Studio 2010: Properties.Settings broken after retargetting project to .NET Framework 3.5

Visual Studio 2010 带有一个新功能:

工具、选项、调试、常规、启用 .NET Framework 源代码步进

按照 MSDN 页面How to: Debug .NET Framework Source 上的说明进行操作:

启用 .NET Framework 源代码调试

    工具菜单上,点击选项

    选项对话框中,点击Debugging类别。

    常规框中,选中以下复选框:

    启用 .NET Framework 源代码步进 启用源服务器支持

我这样做:

注意:您会注意到,正如 MSDN 页面所指出的,正如我所注意到的,选中 Enable .NET Framework source stepping 将自动取消选中 **Enable Just My代码(仅限托管)。我还启用了源服务器支持的诊断消息。

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

注意Microsoft Symbol Server条目已经存在(并且无法删除)。


MSDN 页面说要加载符号:

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

    模块 窗口中,右键单击未加载符号的模块。您可以通过查看符号状态列来判断符号是否已加载。

    指向 Load Symbols From 并单击 Microsoft Symbol Servers 以从 Microsoft 公共符号服务器或 Symbol Path 下载符号以从您拥有的目录加载以前存储的符号。

我试试这个:

然后加载所有符号:

我一直坐在断点上,即将调用 .NET 框架代码:

protected override void ScaleControl(SizeF factor, BoundsSpecified specified)

    base.ScaleControl(factor, specified);

按下 F11 会使调试器简单地跳到下一行:

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);

如何在 Visual Studio 2010 中启用 .NET Framework 源代码步进?


我正坐在代码中的断点处。我尝试在调用堆栈中双击一个函数。我希望这能让我跳转到 .NET 代码:

除了它不起作用:Visual Studio 告诉我没有可用的源:

如何在 Visual Studio 2010 中启用 .NET Framework 源代码步进?


如果我在尝试进入 .NET 代码之前切换到反汇编视图(Debug -> Windows -> Disassembly),我可以在 .NET 代码中查看 call

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

这与能够进入 .NET Framework 源代码不同或有用。

如何在 Visual Studio 2010 中启用 .NET Framework 源代码步进?


我电脑上配置的符号缓存路径确实包含符号缓存文件:

所以它正在下载pdb符号文件,但拒绝使用它们。

如何在 Visual Studio 2010 中启用 .NET Framework 源代码步进?


Leppie 建议我检查Debug 日志(打开调试日志窗口;否则它不会记录任何内容):

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.

所以它正在找到我的符号,但声称找不到它们。

如何在 Visual Studio 2010 中启用 .NET Framework 源代码步进?


一位来自微软意大利的人建议关闭要求源文件与原始版本完全匹配

这并没有解决问题。

如何在 Visual Studio 2010 中启用 .NET Framework 源代码步进?


有人建议微软的 .NET Framework 4.0 源服务器存在错误。根据该建议,我将项目切换到目标 .NET Framework 3.5

这并没有解决问题。

如何在 Visual Studio 2010 中启用 .NET Framework 源代码步进?


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

这并没有解决它:

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

如何在 Visual Studio 2010 中启用 .NET Framework 源代码步进?


另见

Configuring Visual Studio to Debug .NET Framework Source Code Unable to debug .NET framework code in VS2010 .NET framework source stepping not working despite options set Setting up Visual Studio 2010 to step into Microsoft .NET Source Code Visual Studio 2008 SP1 .NET Framework Source Debugging No Debug>Modules window in Visual Studio 2008 Version 9.0.21022.8 RTM

【问题讨论】:

你检查过源代码'缓存'吗? @leppie “源代码‘缓存’”是什么意思?如果您的意思是缓存源代码的文件夹,它正在被填充(参见 Update 4 是的。是否可以打开该源文件并设置断点? 这个问题写得很好! 它在 VS2012 中也不起作用。在我配置完所有内容并停止工作后,它工作了一天。两天后,几十个咖啡,几百个网页,它就不起作用了。同时,symbolsource.org 发布的资源确实很有吸引力。 【参考方案1】:

仅针对 RTM 和 Service Pack 发布用于单步执行源代码的 PDB。因此,当安全更新出现并且它修改了您尝试调试的 dll 时,它将导致源单步执行不起作用(即,您将获得“无可用源”和灰色的“浏览以查找源” ”)。

但是,一旦您完成了所有适当的设置,您就可以使用以下解决方法。解决方法本质上是找到导致 dll 更改的安全更新,然后将其删除。这样做的明显缺点是在您的计算机上删除了这些安全更新。

解决方法

    确定要调试到哪个 dll(例如 System.Windows.Forms.dll) 调试时,在Visual Studio中打开Modules窗口,找到Version栏。如果版本不是 RTM 或 Service Pack 版本,则您需要执行工作流。通常,RTM dll 会说“由:RTMRel 构建”。虽然作为安全更新一部分的 dll 会显示“由:RTMGDR 构建”。记下版本号(例如 4.0.30319.269 由:RTMGDR 构建) 现在,我们要查找创建此版本的更新。通过在 support.microsoft.com/kb/ 上搜索 dll 和版本号来执行此操作 例如,我做了以下谷歌搜索: site:support.microsoft.com/kb System.Windows.Forms.dll 4.0.30319.269 搜索应该会显示有关更新的信息。请注意地址栏中的 KB 编号。在我的例子中,地址是 http://support.microsoft.com/kb/2604121,所以 KB2604121,是我们感兴趣的。 转到控制面板->程序和功能,然后单击“查看已安装的更新” 查找列出 KB 编号的更新(您可以使用右上角的搜索)。 卸载该更新。 对同一个 dll 重复此过程,直到 dll 恢复到其 RTMRel 版本或 SP 版本。例如,对于 System.Windows.Forms.dll,我必须先删除 KB2686827、KB2604121、KB2518870,然后才能恢复到 RTMRel 版本。

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

完成后,在 .net 源代码中设置断点(例如,转到 Breakpoints 选项卡,例如 New->Break at Function,然后输入 System.Windows.Forms.Form.Form)或进入其中之一该dll中的.net方法。

【讨论】:

对,诀窍是找到要卸载的正确文件(因为通常您安装了 很多 个文件,而且它们确实需要一段时间才能卸载)。 我无法卸载安全更新。这是违反公司政策的。有没有办法获取与 Microsoft 符号服务器匹配的 mscorlib.dll(和其他)的副本?我的 mscorlib.dll 是版本 4.0.30319.269 (RTMGDR.030319-2600)。可能,我可以用这个新的 DLL 临时更新 GAC 并尝试源代码步进。 这可能也违反了我的公司政策——我只是在完成后重新安装它们。我认为您不能只插入一个旧版本的 mscorlib.dll,而与其他应该回滚的 dll 无关(以便它正常工作)。此外,使用旧 dll 临时更新 GAC 本质上等同于临时卸载安全更新。 微软不发布安全更新源的可能原因是有人可以比较代码更改,了解安全漏洞是什么,并创建自己的漏洞利用。 Microsoft 没有意识到的是,“源代码” 已经可以使用 ILSpy 或 Relfector 获得。因此,微软不发布源代码实际上并没有让任何人更安全——只是开发人员的生活更加艰难。 @IanBoyd 我怀疑这是 MS 的动机。我假设他们的工作流程根本不支持更新源 PDB 以进行调试。他们主要关心的是关闭安全漏洞。【参考方案2】:

不幸的是,正如 Leppie 指出的那样,Microsoft 存在问题(我得到了相同的结果,请参阅

"No Source Available" - Visual Studio Debugging (even when symbols have loaded))

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

微软符号服务器

代替:

referencesource.microsoft.com/symbols

请参阅Configuring Visual Studio to Debug .NET Framework Source Code 的常见问题解答/疑难解答部分

【讨论】:

【参考方案3】:

我想我已经找到答案了。

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

当 VS 尝试从“referencesource”服务器加载符号时,它会失败 (404)。由于这失败了,我认为它无法映射到该服务器上的源文件。

http://referencesource.microsoft.com/symbols/mscorlib.pdb/ED96A7F38A2940F39B9CA7AD9BC5CB671/mscorlib.pdb

在上述失败后,它会尝试一些名为“msdl”的服务器,并在其中找到实际的 PDB(但它似乎没有源代码信息)。

http://msdl.microsoft.com/download/symbols/mscorlib.pdb/ED96A7F38A2940F39B9CA7AD9BC5CB671/mscorlib.pd_

总而言之,这似乎是他们服务器的(临时)Microsoft 问题。

我确信我之前有一些源代码。但是现在不行了。

编辑:

我尝试了各种 .NET 版本,结果都一样。 :(

【讨论】:

如果我的确切步骤应该有效(但不可行),有效(将来),并且工作(但不是今天)。这也会非常令人沮丧,因为我在这个问题上花了 11 个小时。 msdl.microsoft.com 似乎是 Microsoft 符号服务器 又坏了 似乎不是“临时服务器问题”,7年后链接仍然失效。【参考方案4】:

如果您安装了 SP1,现在它无法正常工作。以下是关于问题形式 MS 的一些评论:http://social.msdn.microsoft.com/Forums/en-US/refsourceserver/thread/41388c7b-582b-4e3f-8178-3d38a3c99639

【讨论】:

【参考方案5】:

在我的例子中,我正在调试一个旧的 .NET 2.0 WinForms 应用程序,我收到了 “Source Not Available” 消息。我尝试了所有推荐的设置。

最终,我重新构建了应用程序以临时针对 .NET 4.5 并且能够使源步进工作。也许我的应用程序对于源步进来说太旧了。我知道,有点违背了目的,但是对于快速而肮脏的测试,它是有效的。 .NET 4.5 中仍然存在我的错误。 :)

【讨论】:

【参考方案6】:

您可以在此处找到参考源,可供下载:

.NET Framework 4.0 Reference source

WCF、WF 甚至 4.5 Beta / RC 等的源代码 也可以在那里找到:

Microsoft Referencesource NetFramework

【讨论】:

源代码没有符号是没用的。除非你喜欢搜索一段特定的代码;p【参考方案7】:

这里是官方说明https://referencesource.microsoft.com/setup.html

配置 Visual Studio 2013 以调试 .NET 框架

为了配置 Visual Studio 2013,请在工具中执行以下操作 -> 选项 -> 调试 -> 常规菜单:

只禁用我的代码 禁用跨属性和运算符 禁用要求源文件与原始版本完全匹配 启用 .NET 框架源代码步进 启用源服务器支持

【讨论】:

【参考方案8】:

如果你想调试开源代码(比如nuget包),你可以把这个url添加到你的符号服务器列表中

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

http://www.symbolsource.org/Public/Home/VisualStudio

【讨论】:

以上是关于如何启用“启用 .NET Framework 源单步执行”?的主要内容,如果未能解决你的问题,请参考以下文章

如果已启用,如何修复“当前未启用对实验语法 'classProperties' 的支持”错误?

Linux的透明大页如何启用禁用

markdown ubuntu如何启用IPv6.ubuntu如何启用IPv6。

如何在 iCloud 未启用时保存文件,然后启用

如何在 Ubuntu 20.04 上安装启用 SSH

如何以编程方式启用自动启动和浮动窗口权限