DotNet Framework源代码调试问题
1)首先怀疑是我配置有问题,难道是我2010版本的问题?于是在msdn网站上找到这个:How to: Debug .NET FrameworkSource
not working!
This never workedfor me. Not even with *fresh* Windows 7 x64 and Visual Studio 2010installations. All I'm getting is "No source available". And peopleall over the Internet are crying out loud that it's not working for themeither. It's frustrating, you know?
例如:
http://social.msdn.microsoft.com/Forums/en-US/refsourceserver/threads?page=1(ReferenceSource Server Discussion)
http://stackoverflow.com/questions/8139269/vs2010-how-to-enable-enable-net-framework-source-stepping
(How do i enable .NETframework source stepping in Visual Studio 2010?)
注意上面的这个地址,这个人总结给我很大的启发。
3、 问题确定
上面那个人的回答突然让我想到是不是因为pdb版本问题或者.netframework版本源代码问题。因为微软并非所有的都开源了,有些是没有开源的,我看的源代码位于System.Windows.Forms中,这个程序集是可以确认开源了的。因此只有可能是版本问题,我的dll和pdb版本不匹配。为了确认,我查看了下vs2010加载的到底是哪个版本的pdb。如下:
C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System.Windows.Forms\v4.0_4.0.0.0__b77a5c561934e089\System.Windows.Forms.pdb:Cannot find or open the PDB file.
D:\ProgramFiles\Microsoft Visual Studio 10.0\Common7\IDE\System.Windows.Forms.pdb: Cannotfind or open the PDB file.
d:\symbolscache\System.Windows.Forms.pdb\98E168F147A646C9BE3D5B9C755E65DA1\System.Windows.Forms.pdb:Symbols loaded.
具体查看方法:在堆栈窗口上选中要查看的模块,然后右键,选择“Symbol Load Information”。或者在“模块窗口”中选择相应的模块,右键“Sysmbol Load Information”查看。
通过上面的信息,我们可以得出一个小结论,就是vs2010加载pdb文件是有搜索路径的。
很明显,它加载的是我d盘下面的缓存文件夹下的pdb文件,采用diadump程序(在visualstudio的安装目录下的dia samples目录下)。可以查看pdb文件的内容,可以看到这个pdb文件是public pdb文件,而不是private build pdb文件,难怪不能关联源文件。
同样,我们通过dumpbin可以查看下这个dll的debug关联信息。
可以看到pdb文件名是System.Windows.Forms.pdb。
加载的pdb文件是:
System.Windows.Forms.pdb\98E168F147A646C9BE3D5B9C755E65DA1\System.Windows.Forms.pdb
上面提到要注意symbols这个目录,这个目录的结构是这样的:
程序集关联的pdb文件名\GUID\程序集关联的pdb文件名
说明我的程序集的关联的pdb文件是{99****}的一个pdb文件,于是我从下载的目录中F:\DotNetRefSrc\Symbols\system.windows.forms.pdb查看有没有这个目录,发现没有,难怪vs会去微软服务器上下载。
所有微软发布的源代码的pdb只有:
明显没有99开头的guid。
我的环境是.Net Framework 4sp1+VS2010 sp1。我赶紧去gac中查看System.Windows.Forms.dll的版本,可以看到这个信息:
文件版本是4.0.30319.235。而发布的带源代码的只有4.0.30319.1的。。。同样我查看了3.5sp1的版本,发现发布的最高版本只有50727.4016 ,我的是2.0.50727.4961。
4、总结
至此,我总算明白了原因所在。很明显主版本号都是一致的,而是后面的修订版本号和我的不一样,很有可能是我的电脑安装的某些补丁造成的,而微软又是不发布相关update的pdb文件和源代码的。因此造成pdb文件不匹配,于是vs根据guid去它的public sysmbol server去取public build pdb文件,造成无法关联源代码文件,也就没有办法进行跟踪.net framework源代码了。
对这个问题,在微软的论坛中,也有人建议在虚拟机中建立一个对应发布了源代码的Framework的版本,不要更新。问题是这样也太麻烦了吧?而且对于我们这种又不是专门天天去看Framework的源代码,大部分时候是因为在写应用的时候,因为碰到一个问题,需要跟入Framework源代码去,方便了解整个机理。可是。。。。。。
还有就是采用Reflector的vs plugin,不过Reflector现在可是收费的。
参考信息:
Reference Source Code Center Team Blog(参考代码开放官方博客,发布有开放的版本信息)
http://blogs.msdn.com/b/rscc/
Reference Source ServerDiscussion (官方论坛)
http://social.msdn.microsoft.com/Forums/en-US/refsourceserver/threads?page=1
(官方网站)
http://referencesource.microsoft.com/Default.aspx
VS2010: How to enable “Enable .NET Framework source stepping”? (网上人与我相同的问题)
http://stackoverflow.com/questions/8139269/vs2010-how-to-enable-enable-net-framework-source-stepping
How to: Debug .NET Framework Source(微软msdn文档中心)
http://msdn.microsoft.com/en-us/library/cc667410.aspx