如何启用“启用.NET Framework源代码步进”?


118

2013年2月22日更新:Microsoft Connect条目具有Alok Shriram(程序经理,基类库,.NET Framework)的注释,该问题现在应该已解决。连接条目标记为已解决(已修复)

现在应该解决此问题。我们发布了参考资源的更新。如果您的问题仍未解决,请告知我们。

一年半。

奖励链接

原始问题

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


注意:这个问题是一个较大的整体中的一个:


Visual Studio 2010带有一项新功能:

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

选项菜单的屏幕截图

按照MSDN页面上的说明进行操作:调试.NET Framework源

启用.NET Framework源调试

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

  2. 在“ 选项”对话框中,单击“ 调试”类别。

  3. 常规框中,选择以下复选框:

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

我这样做:

选项菜单的屏幕快照,突出显示所选的相关选项

注意:正如MSDN页面所指出的那样,您将注意到,并且正如我注意到的那样,选中“ 启用.NET Framework源代码步进”将自动取消选中“仅启用我的代码”(仅受管理)。我还启用了源服务器支持的诊断消息。

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

选项菜单的屏幕快照,显示缓存目录(突出显示)

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


MSDN页面说要加载符号:

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

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

  2. 指向从中加载符号,然后单击“ Microsoft符号服务器”以从Microsoft公共符号服务器下载符号,或从“符号路径”中下载符号以从以前存储符号的目录中加载。

我尝试这样:

在此处输入图片说明

然后加载所有符号:

如上所述,“模块”窗口的屏幕快照

我一直坐在一个断点上,该断点将调用.NET Framework代码:

代码的屏幕截图,转录如下

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代码之前切换到汇编视图(调试 - > 视窗 - > 拆卸),我可以看到call在.NET代码:

代码截图

当我这样做时,我最终调试了反汇编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源代码步进?


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

在此处输入图片说明

那没有解决。

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


某处的人无所事事地想知道另一个遇到相同问题的人是否正在使用64位版本的调试器。现在,没有64位版本的Visual Studio这样的东西,但是在Microsoft不支持64位处理器的情况下,我尝试将项目从AnyCPU切换到x86(正在将其JIT转换为x64):

在此处输入图片说明

那没有解决它:

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

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


也可以看看


您是否检查了源代码“缓存”?
leppie

@leppie“源代码'缓存'”是什么意思?如果您是指用于缓存源代码的文件夹,则说明该文件夹已被填充(请参阅Update 4
Ian Boyd

是。是否可以打开该源文件并设置断点?
2011年

1
优秀的问题写下来!
andersonbd1

1
它也不在VS2012中工作。在我完成所有配置并停止工作之后,它工作了一天。两天后,数十个咖啡,数百个网页都无法正常工作。同时,symbolsource.org发布的资源的确发挥了魅力。
Wiktor Zychla

Answers:


35

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

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

解决方法

  1. 确定要调试到的dll(例如System.Windows.Forms.dll)
  2. 调试时,在Visual Studio中打开“ 模块”窗口,找到“ 版本”列。如果版本不是RTM或Service Pack版本,则需要执行工作流程。通常,RTM dll会说“由...建立:RTMRel”。而作为安全更新一部分的dll将说“由...建立:RTMGDR”。记下版本号(例如,RTMGDR构建的4.0.30319.269)
  3. 现在,我们要查找创建该版本的更新。通过在support.microsoft.com/kb/中搜索dll和版本号来执行此操作,例如,我进行了以下Google搜索: 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.Windows.Forms.dll,我必须先删除KB2686827,KB2604121,KB2518870,然后再将其恢复为RTMRel版本。

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

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


1
正确,诀窍是找到要卸载的正确组件(因为通常您已经安装了很多组件,并且卸载确实需要一些时间)。
马特·史密斯

我无法卸载安全更新。这违反公司政策。有没有一种方法可以获取与Microsoft Symbols服务器匹配的mscorlib.dll(和其他)副本?我的mscorlib.dll是版本4.0.30319.269(RTMGDR.030319-2600)。可能地,我可以使用此新DLL临时更新GAC并尝试执行源代码步进。
kevinarpe

这也可能违反了我的公司政策-完成后,我只是重新安装它们。我不认为您可以将旧版本的mscorlib.dll放到其他应与之回滚的dll无关的位置(以使其正常工作)。此外,使用旧dll临时更新GAC本质上等同于临时卸载安全更新。
马特·史密斯

Microsoft不发布安全更新源的可能原因是,有人可以比较代码更改,了解安全漏洞是什么并创建自己的漏洞利用程序。微软并没有意识到,“源代码”已经可以通过ILSpy或Relfector获得。因此,Microsoft不发布源代码,实际上并没有使任何人变得更安全-只是开发人员的生活更加困难。
伊恩·博伊德

2
@IanBoyd我怀疑这是MS的动力。我以为他们的工作流根本不支持更新源PDB进行调试。他们主要关心关闭安全漏洞。
xanadont 2012年


4

我想我已经找到了答案。

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

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

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

编辑:

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


1
如果我的确切步骤可以工作(但不可以),可以工作(将来)并可以工作(但今天不可以),那将非常有趣。因为我花了11个小时来解决这个问题,所以这也非常令人沮丧。
伊恩·博伊德

2
msdl.microsoft.com似乎是Microsoft Symbol Server
yoel halb 2012年

2
它又被打破了
Simon_Weaver 2014年

似乎不是“临时服务器问题”,但是7年后,链接仍然无效。
jrh


1

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

最终,我重新构建了该应用程序,使其暂时针对.NET 4.5,并且能够使源代码正常工作。也许我的应用程序太旧了,无法进行源代码步进。我知道这有点失败,但是对于快速而肮脏的测试,它是可行的。.NET 4.5中仍然存在我存在的错误。:)

目标框架



0

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

配置Visual Studio 2013调试.NET Framework

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.