Update 22nd Feb 2013 :Microsoft Connect条目包含来自Alok Shriram(程序管理器,基类库,.NET Framework)的注释,现在应该解决该问题 . 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:支持DPI和默认字体更改WinForms控件在ScaleControl VS2010期间不会缩放:如何启用“启用.NET Framework源步进”? Visual Studio 2010 Professional:如何访问模块窗口? Visual Studio 2010:将项目重新定位到.NET Framework 3.5后,Properties.Settings中断了
Visual Studio 2010附带了一项新功能:
- 工具,选项,调试,常规, Enable .NET Framework source stepping
按照MSDN页面How to: Debug .NET Framework Source上的说明操作:
启用.NET Framework源调试在“工具”菜单上,单击“选项” . 在“选项”对话框中,单击“调试”类别 . 在“常规”框中,选中以下复选框:启用.NET Framework源步骤启用源服务器支持
我这样做:
Note :您将注意到,正如MSDN页面所说,并且正如我所注意到的那样,检查 Enable .NET Framework source stepping 将自动取消选中**启用我的代码(仅管理) . 我还启用了源服务器支持的诊断消息 .
启用这些选项会自动为我设置符号缓存下载位置:
Note : Microsoft Symbol Server 条目已存在(无法删除) .
MSDN页面表示加载符号:
使用“模块”窗口加载框架符号在“模块”窗口中,右键单击未加载符号的模块 . 您可以通过查看符号状态列来判断符号是否已加载 . 指向“加载符号”并单击“Microsoft符号服务器”以从Microsoft公共符号服务器或符号路径下载符号,以从先前存储符号的目录加载 .
我试试这个:
然后加载所有符号:
我一直坐在断点上,即将调用.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源步进?
微软意大利的一个人建议关闭 Require source files to exactly match original version :
这没有解决它 .
如何在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 (它被JIT到x64),以防微软不支持64位处理器:
这没有解决它:
Step into: Stepping over method without symbols 'System.Windows.Forms.Form.ScaleControl'
如何在Visual Studio 2010中启用.NET Framework源步进?
8 回答
用于单步执行源代码的PDB仅针对RTM和Service Pack发布 . 因此,当安全更新出来并且它修改了您尝试调试的dll时,它将导致源步进无法工作(也就是说,您将获得“无源可用”并显示为灰色“浏览以查找源“) .
但是,一旦完成了所有适当的设置,就可以使用以下解决方法 . 解决方法主要是查找导致dll更改的安全更新,然后删除它们 . 这有明显的缺点,即在您的计算机上删除这些安全更新 .
解决方法
确定要调试的DLL(例如System.Windows.Forms.dll)
调试时,在Visual Studio中打开 Modules 窗口,找到Version列 . 如果版本不是RTM或Service Pack版本,那么您将需要执行工作流程 . 通常,RTM dll会说"built by: RTMRel" . 虽然属于安全更新的dll会说"built by: RTMGDR" . 请注意版本号(例如,由RTMGDR构建的4.0.30319.269)
现在,我们要查找创建此版本的更新 . 通过在support.microsoft.com/kb/上搜索dll和版本号来执行此操作 . 例如,我执行了以下Google搜索:
site:support.microsoft.com/kb System.Windows.Forms.dll 4.0.30319.269
搜索应显示有关更新的信息 . 请注意地址栏中的KB编号 . 在我的例子中,地址是
http://support.microsoft.com/kb/2604121
,因此KB2604121是我们感兴趣的 .转到“控制面板” - >“程序和功能”,然后单击“"View Installed Updates"”
查找列出KB编号的更新(您可以使用右上角的搜索框) .
卸载该更新 .
对此相同的dll重复此过程,直到dll返回其RTMRel版本或SP版本 . 例如,对于System.Windows.Forms.dll,我必须在它返回到RTMRel版本之前删除KB2686827,KB2604121,KB2518870 .
您需要为.NET框架中您关心调试的每个dll执行此操作 .
完成后,在.net源代码中设置一个断点(例如,转到Breakpoints选项卡,比如New-> Break at Function,然后输入System.Windows.Forms.Form.Form)或者进入.net之一.net那个dll中的方法 .
不幸的是,正如Leppie所指出的那样,微软存在一个问题(我得到了同样的结果
应该注意的是,无论如何你的尝试都会失败,因为你引用了:
代替:
referencesource.microsoft.com/symbols
请参阅Configuring Visual Studio to Debug .NET Framework Source Code的常见问题/故障排除部分
我想,我找到了答案 .
我追踪了小提琴手上发生的事情 . 似乎只有符号目前可用,没有来源 .
当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问题 .
我确信我有一些源代码 . 但现在它没有用 .
Edit:
我尝试了各种.NET版本,结果都一样 . :(
目前,如果安装了SP1,则无法正常工作 . 以下是关于问题形式MS的一些评论:http://social.msdn.microsoft.com/Forums/en-US/refsourceserver/thread/41388c7b-582b-4e3f-8178-3d38a3c99639
您可以在此处找到参考源,可供下载:
.NET Framework 4.0 Reference source
WCF,WF,甚至4.5 Beta / RC以及更多的来源也可以在那里找到:
Microsoft Referencesource NetFramework
以下是官方说明https://referencesource.microsoft.com/setup.html
在我的情况下,我正在调试一个旧的 .NET 2.0 WinForms 应用程序,我得到了 "Source Not Available" 消息 . 我尝试了所有推荐的设置 .
最终,我重新构建了应用程序以临时定位 .NET 4.5 并且能够让源代码步进工作 . 也许我的应用程序太旧了,无法使用源代码 . 我知道,有点失败的目的,但对于快速和肮脏的测试它是有效的 . 我所遇到的错误仍然存在于 .NET 4.5 中 . :)
如果要调试开源代码(例如nuget包),可以将此URL添加到符号服务器列表中
http://srv.symbolsource.org/pdb/Public