DotNet Framework源代码调试问题
?
幾年前,記得vs2008剛發布的時候,帶了一個新的特性,就是可以調試.Net Framework的源代碼,當時非常興奮,馬上實驗了一下,按照(ConfiguringVisual Studio to Debug .NET Framework Source Code)http://blogs.msdn.com/b/sburke/archive/2008/01/16/configuring-visual-studio-to-debug-net-framework-source-code.aspx
配置VS2008,就可以看到神奇的.net framework源代碼。相當簡單方便。后面因為時間原因,也沒有太多時間去追蹤查看學習.net framework的源代碼。
幾年后的今天,因為一些問題,需要查看下.NetFramework的實現機理,卻發現怎么配置也無法step in .net framework的源代碼了。害的我花了將近一天時間查資料,才總算把這個問題弄明白了。
在網上有大量的人碰到了這個問題,baidu或者google一下,會發現無論是國內還是國外,很多人都碰到了問題,回答的人也有各種答案,但是真正能解決問題的似乎沒有。無論怎樣,經過自己的努力,總算找到了原因,在這里寫出來,希望給同樣碰到這個問題的人有所啟發,少走彎路,由于本人水品有限,如有高手不吝指正錯誤,萬分感謝!
在解釋下面的過程前,你需要對pdb文件有所熟悉了解,如果您不熟悉,請參見我的另外一篇博文《VS中調試時不能關聯源代碼問題》中的pdb文件知識部分。
1、 問題描述
1)在微軟的開放源碼參考網站上,有配置vs2008的說明。地址在:http://referencesource.microsoft.com/serversetup.aspx
按照上面的配置后,發現不行。
如圖:
這樣設置后(注意我f:盤中的路徑設置是從網站上下載的msi文件安裝路徑,后面還有解釋。),調試程序,下斷點,在堆棧窗口中會看到.net framework的程序集變成亮色了(沒有加載pdb的程序集會顯示灰色)。但是雙擊,會出現:
No Source Available的界面提示:
而且Browse to Find Source不能使用。關于Browse to FindSource的問題,請參見本人另外一篇博文《VS中調試關聯源代碼問題》。
2)按照第二種方式,將源代碼下載下來(官方說明:http://referencesource.microsoft.com/downloadsetup.aspx)安裝,然后配置。下載地址:http://referencesource.microsoft.com/netframework.aspx。經證實還是不行。在這里我多說兩句,以這種方式安裝源代碼和pdb文件時候,建議把上面地址中的所有包都下載下來安裝,而且安裝在統一的文件夾下面,這個是不會有沖突的。因為pdb和源代碼是和build相關聯的。安裝在一個目錄下,以后方便只設置一個symbols目錄就可以了。如我上圖中的“F:\DotNetRefSrc”。安裝完了,可以看到如下的目錄結構:
其中Source子目錄是每個發布版本的源代碼鏡像,Symbols是pdb文件目錄。我們需要特別關注一下Symbols目錄。
2、 問題探究
1)首先懷疑是我配置有問題,難道是我2010版本的問題?于是在msdn網站上找到這個:How to: Debug .NET FrameworkSource
http://msdn.microsoft.com/en-us/library/cc667410.aspx
說明vs2010也應該可以的呀。
為了證實,于是又啟動vs2008實驗了一下,發現還是一樣。所以確認不是版本問題。而且下面有人留言在說微軟這個問題:
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?
2)于是百度,google。發現網上很多人碰到這個問題。看來不只是我的問題。
3)在microsoft的官方網站和論壇中,也有很多人在咨詢這個問題。
例如:
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”?;蛘咴凇澳K窗口”中選擇相應的模塊,右鍵“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
?
?
/*****************************************************************/
/**? 本人原創文章,轉摘請保留本段內容,萬分感謝!
/**? microdreamsoft(Lin Shaohua):
/**? 由于本人水平有限,歡迎各位高手指正。
/**? 本人所有原創文章將發布在以下blog:
/**? http://hi.baidu.com/microdreamsoft
/**?? http://blog.csdn.net/hydream
/**?? http://www.cnblogs.com/MicroDreamSoft/
/**?? http://websoso.bokee.com/
/**?? http://89727175.qzone.qq.com/
/**?? http://751728871.qzone.qq.com/
/*****************************************************************/
?
?
?
?
?
轉載于:https://www.cnblogs.com/MicroDreamSoft/archive/2012/02/08/2342363.html
總結
以上是生活随笔為你收集整理的DotNet Framework源代码调试问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: .net 网页播放器
- 下一篇: js 字符串去空格