Update 22nd Feb 2013:Microsoft Connect条目中有来自Alok Shriram(程序管理器,基类库,.NET Framework)的注释,该问题现在应该得到解决.连接条目标记为Resolved (Fixed):

这个问题现在应该得到解决.我们发布了参考资料的更新.

一年半了.

Bonus Links

Original Question

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


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


Visual Studio 2010附带了一个新功能:

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

选项菜单截图

遵循MSDN第How to: Debug .NET Framework Source页上的说明:

使能.NET框架源代码调试

  1. Tools菜单上,单击Options.

  2. 在"Options"对话框中,单击"Debugging"类别.

  3. General框中,选中以下复选框:

    • 启用.NET Framework源代码单步执行
    • 启用源服务器支持

我这样做:

选项菜单屏幕截图,突出显示所选的相关选项

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

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

选项菜单屏幕截图,显示缓存目录(突出显示)

Note:Microsoft Symbol Server条目已存在(无法删除).


MSDN页面显示要加载符号:

To load Framework symbols using the Modules window

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

  2. 指向Load Symbols From,然后单击Microsoft Symbol Servers从Microsoft public symbols server下载符号,或从以前存储符号的目录加载符号路径.

我试试这个:

enter image description here

然后加载所有符号:

模块窗口截图,如上所述

I’ve been sitting on a breakpoint, which is about to call into .NET framework code:

下面转录的代码截图

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源代码?


我坐在代码中的断点处.我try 双击调用堆栈中更上层的函数.我希望,这将使我有机会参加jump场比赛.网络代码:

enter image description here

只是它不起作用:Visual Studio告诉我没有可用的源代码:

错误消息屏幕截图显示没有可用的源

如何启用.Visual Studio 2010中的NET Framework源代码?


If I switch to disassembly view before trying to step into .NET code (Debug -> Windows -> Disassembly), I can see a call into the .NET code:

代码截图

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

反汇编窗口截图

这不同于能够单步执行.NET Framework源代码,也不像能够单步执行.NET Framework源代码那样有用.

如何启用.Visual Studio 2010中的NET Framework源代码?


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

文件夹列表截图

所以它下载了pdb个符号文件,但拒绝使用它们.

如何启用.Visual Studio 2010中的NET Framework源代码?


Lepbie建议我判断Debug日志(log)(在调试日志(log)窗口打开的情况下;否则它不会记录任何内容):

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

在日志(log)的前面部分,我看到它加载了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

所以它找不到我的符号,却声称找不到.

如何启用.Visual Studio 2010中的NET Framework源代码?


一位来自微软意大利的家伙建议关闭Require source files to exactly match original version:

选项窗口截图

这并没有解决问题.

如何启用.Visual Studio 2010中的NET Framework源代码?


有人认为微软的源服务器有一个.NET Framework 4.0年的漏洞.根据这个建议,我将项目切换到目标.NET Framework 3.5:

enter image description here

这并没有解决问题.

如何启用.Visual Studio 2010中的NET Framework源代码?


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

enter image description here

但这并没有解决问题:

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

如何启用.Visual Studio 2010中的NET Framework源代码?


另请参阅

推荐答案

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

但是,一旦您进行了所有适当的设置,您就可以使用以下解决方法.解决方法实质上是查找导致DLL更改的安全更新,然后将其删除.这有一个明显的缺点,那就是在您的计算机上删除这些安全更新.

解决方法

  1. 确定要调试到的DLL(例如System.Windows.Forms.dll)
  2. 调试时,在Visual studio中打开Modules窗口,找到Version列.如果版本不是RTM或Service pack版本,则需要执行工作流.通常RTM dll会显示"Build by:RTMRel".而作为安全更新一部分的dll将显示"Build by:RTMGDR".注意版本号(例如4.0.30319.269构建者:RTMGDR)
  3. 现在,我们想找到创建这个版本的更新.通过在support上搜索dll和版本号来实现这一点.微软com/kb/
  4. 搜索应该会找到有关更新的信息.请注意地址栏中的KB编号.在我的示例中,地址是 http://support.microsoft.com/kb/2604121,也就是KB2604121,是我们感兴趣的.
  5. Go to Control Panel->Programs and Features, and click "View Installed Updates"
  6. 查找列出KB编号的更新(您可以使用右上角框中的搜索).
  7. 卸载该更新.
  8. 对同一DLL重复此过程,直到DLL返回到其RTMRel版本或SP版本.例如,对于System.Windows.Forms.dll,我必须删除KB2686827、KB2604121、KB2518870才能恢复到RTMRel版本.

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

Once that's done, set a breakpoint within the .net source (for example, go to the Breakpoints tab, say New->Break at Function, and enter System.Windows.Forms.Form.Form) or step into one of the .net methods in that dll.

.net相关问答推荐

尽管有`disable`注释,但未 suppress Pylint语法错误

PowerShell 5.1和7在使用证书时的区别

是否可以将 SandCastle 创建的两个页面合并到一个主页中?

调整小数精度,.net

单击关闭按钮时隐藏表单而不是关闭

设置日志(log)文件名以在 Log4j 中包含当前日期

SqlDateTime.MinValue != DateTime.MinValue,为什么?

为什么我得到 411 Length required 错误?

通用枚举到int的C#非装箱转换?

生产代码中的 System.Diagnostics.Debug.WriteLine

将 Topshelf 应用程序安装为 Windows 服务

控制台应用程序的退出时

覆盖方法上的 C# 可选参数

如何将时间设置为当天的午夜?

多个添加的实体可能具有相同的主键

何时何地使用 GetType() 或 typeof()?

log4net的正确使用方法(记录器命名)

使 HashSet 不区分大小写

清除文件内容

并发字典正确用法