如何启用"启用.NET Framework源步进"?

Ian*_*oyd 116 .net visual-studio-2010 visual-studio

2013年2月22日更新:Microsoft Connect条目包含来自Alok Shriram(程序管理器,基类库,.NET Framework)的注释,现在应该解决该问题.Connect条目标记为已解决(已修复):

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

一年半.

奖金链接

原始问题

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


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


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

代码截图,转录如下

protected override void ScaleControl(SizeF factor, BoundsSpecified specified)
{
    base.ScaleControl(factor, specified);
Run Code Online (Sandbox Code Playgroud)

推送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);
Run Code Online (Sandbox Code Playgroud)

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


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

在此输入图像描述

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

错误消息的屏幕截图,显示无源可用

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


如果我在尝试进入.NET代码(Debug - > Windows - > Disassembly)之前切换到反汇编视图,我可以看到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'
Run Code Online (Sandbox Code Playgroud)

在日志的早些时候我看到它加载符号System.Windows.Forms.dll:

Loaded 'C:\Windows\assembly\GAC_MSIL\System.Windows.Forms\2.0.0.0__b77a5c561934e089\System.Windows.Forms.dll', Symbols loaded.
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

因此,它发现我的符号,但声称它无法找到他们.

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


来自Microsoft Italy的人建议关闭Require sources文件以与原始版本完全匹配:

选项窗口的屏幕截图

这没有解决它.

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


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

在此输入图像描述

这没有解决它.

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


有人在某个地方想知道另一个遇到同样问题的人是否正在使用64位版本的调试器.现在,没有64位版本的Visual Studio,但我尝试将我的项目从AnyCPU切换到x86(它被JIT到x64),以防微软不支持64位处理器:

在此输入图像描述

这没有解决它:

Step into: Stepping over method without symbols 'System.Windows.Forms.Form.ScaleControl'
Run Code Online (Sandbox Code Playgroud)

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


也可以看看

Mat*_*ith 35

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

但是,一旦完成了所有适当的设置,就可以使用以下解决方法.解决方法主要是查找导致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选项卡,比如New-> Break at Function,然后输入System.Windows.Forms.Form.Form)或者进入.net之一.net那个dll中的方法.

  • 简短版本:卸载安全更新 (7认同)
  • @IanBoyd我怀疑这是MS的动力。我以为他们的工作流程根本不支持更新源PDB进行调试。他们主要关心关闭安全漏洞。 (2认同)

yoe*_*alb 6

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

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

  • Microsoft Symbol Server

代替:

  • referencesource.microsoft.com/symbols

请参阅配置Visual Studio以调试.NET Framework源代码的常见问题/疑难解答部分