ChatGPT解决这个技术问题 Extra ChatGPT

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

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

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

一年半。

奖励链接

投票决定在 Microsoft Connect 上修复此错误。

Microsoft Social 上的线程已经持续了一年半,询问何时修复。

原始问题

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

注意:这个问题是一个更大的整体:.NET 2.0 WinForm:支持 DPI 和默认字体更改 WinForms 控件在 ScaleControl VS2010 期间不缩放:如何启用“启用 .NET Framework 源步进”? Visual Studio 2010 Professional:如何访问“模块”窗口? Visual Studio 2010:将项目重定向到 .NET Framework 3.5 后,Properties.Settings 中断

Visual Studio 2010 带有一个新功能:

工具、选项、调试、常规、启用 .NET Framework 源单步执行

https://i.stack.imgur.com/8Gu2K.png

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

启用 .NET Framework 源代码调试 在“工具”菜单上,单击“选项”。在“选项”对话框中,单击“调试”类别。在“常规”框中,选中以下复选框: 启用 .NET Framework 源单步执行 启用源服务器支持

我这样做:

https://i.stack.imgur.com/1iXjt.png

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

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

https://i.stack.imgur.com/VwhtM.png

注意:Microsoft 符号服务器条目已经存在(并且无法删除)。

MSDN 页面说要加载符号:

使用“模块”窗口加载框架符号 在“模块”窗口中,右键单击未加载符号的模块。您可以通过查看符号状态列来判断符号是否已加载。指向 Load Symbols From 并单击 Microsoft Symbol Servers 以从 Microsoft 公共符号服务器下载符号,或单击 Symbol Path 以从您之前存储符号的目录中加载。

我试试这个:

https://i.stack.imgur.com/6nCtS.png

然后加载所有符号:

https://i.stack.imgur.com/fk7Zm.png

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

https://i.stack.imgur.com/LWA4Z.png

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

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

https://i.stack.imgur.com/wA75K.png

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 代码:

https://i.stack.imgur.com/P8Yts.png

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

https://i.stack.imgur.com/7jt7z.png

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

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

https://i.stack.imgur.com/LFiUp.png

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

https://i.stack.imgur.com/AdXWc.png

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

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

我计算机上配置的符号缓存路径确实包含符号缓存文件:

https://i.stack.imgur.com/7oShE.png

所以它正在下载 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.

https://i.stack.imgur.com/MvyJJ.png

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

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

来自 Microsoft Italy 的一个人建议关闭 Require source files to fully match original version:

https://i.stack.imgur.com/adGuS.png

那并没有解决它。

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

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

https://i.stack.imgur.com/EjPKk.png

那并没有解决它。

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

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

https://i.stack.imgur.com/r826Q.png

那没有解决它:

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

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

也可以看看

配置 Visual Studio 以调试 .NET Framework 源代码

VS2010无法调试.NET框架代码

尽管设置了选项,.NET 框架源单步执行仍不起作用

设置 Visual Studio 2010 以进入 Microsoft .NET 源代码

Visual Studio 2008 SP1 .NET Framework 源代码调试

Visual Studio 2008 版本 9.0.21022.8 RTM 中没有调试>模块窗口

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

M
Matt Smith

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

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

解决方法

确定要调试到哪个 dll(例如 System.Windows.Forms.dll) 调试时,在 Visual Studio 中打开“模块”窗口,找到“版本”列。如果版本不是 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)或进入 .net 之一该dll中的方法。


是的,诀窍是找到要卸载的正确的(因为通常您安装了很多它们,并且它们确实需要一段时间才能卸载)。
我无法卸载安全更新。这是违反公司政策的。有没有办法获取与 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 以进行调试。他们主要关注关闭安全漏洞。
C
Community

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

“无可用源”-Visual Studio 调试(即使已加载符号))

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

微软符号服务器

代替:

参考来源.microsoft.com/symbols

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


l
leppie

我已经找到了答案,我想。

我追踪了 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_

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

我确信我有一些源代码。但现在它不起作用。

编辑:

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


好吧,如果我的确切步骤应该奏效(但不奏效),会奏效(将来),并且会奏效(但不是今天),那将非常有趣。这也会非常令人沮丧,因为我在这个问题上花了 11 个小时。
msdl.microsoft.com 似乎是 Microsoft 符号服务器
它又坏了
似乎不是“临时服务器问题”,7年后链接仍然无效。
w
watbywbarif

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


B
Brian Chavez

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

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

https://i.stack.imgur.com/IL5M3.png


M
Mare Infinitus

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

.NET Framework 4.0 Reference source

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

Microsoft Referencesource NetFramework


没有符号,源代码是无用的。除非您喜欢搜索特定的代码;p
C
Colonel Panic

以下是官方说明https://referencesource.microsoft.com/setup.html

配置 Visual Studio 2013 以调试 .NET 框架 为了配置 Visual Studio 2013,请在工具 -> 选项 -> 调试 -> 常规菜单中执行以下操作: 仅禁用我的代码 禁用跨属性和运算符 禁用要求源文件完全匹配原版 Enable .NET framework source stepping Enable source server support


n
nandin

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

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

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


关注公众号,不定期副业成功案例分享
关注公众号

不定期副业成功案例分享

领先一步获取最新的外包任务吗?

立即订阅