Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2349126
  • 博文数量: 527
  • 博客积分: 10343
  • 博客等级: 上将
  • 技术积分: 5565
  • 用 户 组: 普通用户
  • 注册时间: 2005-07-26 23:05
文章分类

全部博文(527)

文章存档

2014年(4)

2012年(13)

2011年(19)

2010年(91)

2009年(136)

2008年(142)

2007年(80)

2006年(29)

2005年(13)

我的朋友

分类: WINDOWS

2008-01-19 09:04:50

才知道!
Scott Gu 抢先公布:
http://weblogs.asp.net/scottgu/archive/2008/01/16/net-framework-library-source-code-now-available.aspx
Shawn Burke给出详细配置步骤:
http://blogs.msdn.com/sburke/archive/2008/01/16/configuring-visual-studio-to-debug-net-framework-source-code.aspx

我为什么还在这里贴一遍自己的步骤, 我怕了! 自己动手验证之前网上的东西不能太轻信, 尽管作者很牛, 尽管有很多人叫好, 很多人顶, 顶, 顶! 试一遍往往会发现很多细节.

微软公开了.NET的一部分源码, 虽然不是全部, 但是目前公布的这些应该是份量最重也最有价值的部分. 摘一下
Scrott Gu 文章中列出来的部分:
  • .NET Base Class Libraries (including System, System.CodeDom, System.Collections, System.ComponentModel, System.Diagnostics, System.Drawing, System.Globalization, System.IO, System.Net, System.Reflection, System.Runtime, System.Security, System.Text, System.Threading, etc).
  • ASP.NET (System.Web, System.Web.Extensions)
  • Windows Forms (System.Windows.Forms)
  • Windows Presentation Foundation (System.Windows)
  • ADO.NET and XML (System.Data and System.Xml)
上面这个分类列举有点乱, 第一项是按namespace来的, 后面的则既是 namespace又刚好对应到.NET framework library中的DLL文件不含.DLL扩展部分的名称.

下面是我根据
Shawn Burke给出的详细步骤的结果:

1. Tools->Options->Debugging


上面的这个选项我还从来没看过, 只改了上面红框中的两处, 第一个默认是勾上的, 第二个默认是没勾的. 第二个意思很明显, 第一项不清楚, 先有样学样.

上面的那个URL位置是: 
保险起见, 指定的那个存放symbols的路径我已经手工创建好.

最下面的对话框是点击"Search the above locations..."之后弹出来的, 确定它. 关闭Option对话框.

2. 建一个简单的WinForm 程序, 在Load事件中改变 Text属性, 按Shawn Burke的步骤做, 设断点停住, 然后下载符号文件

注意此时那个 Windows.Forms.dll 的符号还没有下载下来, 所以显示是灰色的. 点击"Load Symbols"菜单项之后会开始下载, 注意最下面的状态栏会显示, 上面的图是拼起来的, 状态栏显示的是System.Xml.dll

最下面是下载完第一个符号文件我有点不太相信, 在Total command里查看实际的磁盘文件. 网速太快了, 有点不太相信10M的东西一下子就完了.

看一个点击"Load Symbols"菜单项之后的license对话框, 确定它就是了:

这种东西从来是不假思索地同意.

3. 下载其它的符号
注意上面列出的 call stack 窗口中不会刚好把所有可以下载的符号文件罗列完全, 通过下面的Module窗口可以看到所有Load到当前进程的DLL:


点击这个菜单项会调出Modules窗口, 它竟然是跟普通.cs源文件一样在文档窗口中:
在这里可以通过右键菜单下载看到的这些dll对应的符号. 上面列出的有些是DLL是没有符号可下载的, 如果点击了下载, 会出来下面的文件对话框, 让你从自己磁盘上指定.pdb文件, 搞笑, 微软意思是说, 我服务器上的就不给你, 有本事你在自己硬盘上找出一个来吧.

取消.

4. Step into 微软的源码
符号文件归符号文件, 真正按F11跟踪进去时, 才去下载源代码. 用到一个源文件下载一个, 并不会一古脑全下载下来. 回头试试能不能通过直接copy来代替下载. 这样就可以脱机使用了. 小组内部安装也方便.
按F11 第一次跟踪进去时, 会弹出另一个license窗口, 是微软的只许看不许改协议:
全盘接受, 之后就看到了微软的 Form.cs源文件了:

不过这个属性的实现毫无新意, 直接转手交给了基类. 再跟进去:
Control基类里的实现就有点跟自己日常的代码不一样了, 首先这个Property带了一大堆Attribute, 其中有些东西在MSDN里是找不到的, 倒是验证了以前用reflector查看的代码中这些奇怪的Attribute不是空穴来风, 的确是微软写的.

跟第一次记录上面这些文字时相比, 现在再次参考它配置家里的机器, 发现symbol server必需设置一个
本地的目录, 并且位于最上面时, 才能真正利用上以前已经下载好的pdb文件, 否则还是会从微软网站上再下载一个, 比较慢, 慢的你会怀疑IDE死了.

我比较了一下, 同样是.NET 2.0中的System.Windows.Forms.pdb 文件, 其MD5 并不一样, 但却都能针对同一个System.Windows.Forms.dll 成功Load:

上面的Cache symbols from symbol servers to this directory
指定的目录作用不明确. 如果是从微软的服务器上下载的pdb, 并未保存在这个目录, 而是存在了
C:\Documents and Settings\zrf\System.Windows.Forms.pdb\3EEB25F167514FF69A150A53AFF8ED091\System.Windows.Forms.pdb
经实验, 原因竟然是 第一次指定的 E:\software\case\dotnet\.NET2.0_Src\  末尾多包含了一个\,
这是从TotalCommander 中直接copy过来的, 这点小小的容错都没有, 唉. 不包含\之后, 微软下载到该目录下的pdb仍然是上面的格式:
System.Windows.Forms.pdb\3EEB25F167514FF69A150A53AFF8ED091\System.Windows.Forms.pdb
每个pdb都要建立一个子目录.

经实验, 直接把pdb文件放在这个目录下也是一样可以成功load的. 这样比较直观.

下面是从我自己指定的位置load, 也一样成功. 这说明DLL与PDB 文件不必是一一对应的关系.

阅读(1237) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~