本文將介紹的是Visual Studio調試中的符號檔案,希望通過本文能對大家瞭解Visual Studio調試有所協助。
對於Visual Studio調試過程中的一些步驟,我們今天需要瞭解的是符號檔案,希望通過本文,能為大家的工作起到事半功倍的效果。
前面在不能設定斷點的檢查步驟和Visual Studio調試之斷點進階篇提到了偵錯符號檔案及其作用,這篇文章我將要介紹偵錯符號檔案的一些用法,如果你已經很熟悉調試檔案的話,盡可以跳過本文。
偵錯符號檔案為調試器提供了從二進位機器代碼地址到原始碼文字檔程式碼的映射.因此有了符號檔案,我們才能:
1. 設定斷點,因為調試器需要符號檔案提供的映射關係,將原始碼行的行號轉換成對應的機器代碼的地址。
2. 查看程式堆棧,簡單地說,就是調試器使用映射關係將堆棧裡面的地址轉換成包含這個地址的函數名。
3. 查看變數的值,對於機器來說,所有的變數都只是一個記憶體位址,程式在讀取變數值的時候,只不過按照變數所屬的類型來讀取指定大小的記憶體而已。
4. 甚至調用程式的一些函數,比如原生(Native)程式,經過編譯以後,在程式裡面實際上只變成了一段機器代碼。我們在立即視窗裡面調用一個C++函數的時候,調試器需要將函數名翻譯成對應的機器代碼的起始地址,當然還要遵循一定的函數調用規則才能調用這個函數。
我們一個一個地看符號檔案的功能:
查看程式堆棧
將Visual Studio以原生程式(Native)偵錯模式附加到一個已開啟的記事本程式上(附:因為我的系統都是英文版,所以中文菜單都是對著英語直接翻譯的,有的會翻譯的不準確,所以我會把英文的命令附在後面),然後中斷記事本進程的執行 — 通過點擊VS菜單裡面的“調試(Debug)”-“全部中斷(Break All)”。
下面是具體的將VS附加到記事本進程的操作(不好意思,錄製的視頻太大,不知道怎麼傳)。
1. 點擊Visual Studio裡面的“工具(Tools)”- “附加到進程……(Attach to Process …)”。
2. 選擇notepad.exe,當然你要保證“附加到… (Attach To…)” 文字框裡面列出的偵錯類型是“原生程式(Native)”。
3.點擊確定以後,將Visual Studio附加到剛剛開啟的記事本進程。
這個時候開啟堆棧(Stack)視窗,你應該會看到類似下面的結果:
上面的堆棧,我也看不懂(我的機器是64位的Windows 7,所以地址都是8個位元組的)。因此我們需要一些東西來幫我們把難理解的地址(鳥語)翻譯成有意義的文字,這個工作就是由符號檔案來完成的。
因為記事本是作業系統內建的程式,我們當然沒有辦法自己產生它對應的符號檔案啦,但是幸運的是,微軟早就已經考慮到可能有一些人需要調試Windows核心—例如寫驅動程式的程式員,因此微軟公司已經將Windows的一些符號檔案公開了,公開的地址在:
http://msdl.microsoft.com/download/symbols
在Visual Studio裡使用的方法是:
1.點擊功能表列裡面的“工具(Tools)”—“選項(Options)”。
2.在“選項(Options)”對話方塊左邊的列表框裡面選擇“調試(Debugging)”-“符號檔案(Symbols)”。
3.如果你的Visual Studio是Visual Studio 2008 SP 1,那麼點擊“從微軟的符號檔案伺服器上載入符號檔案(Load symbols from Microsoft symbols server)”就可以了。
4. 如果是其他版本-當然是低一些的版本,在右側的“符號檔案路徑(Symbol file (.pdb) locations)”列表框裡面添加新的一行,將上面的連結輸入進去。
然後在“將符號檔案快取到這個檔案夾(Cache symbols from symbol servers to this directory:)”文字框裡輸入你要緩衝從伺服器下載的符號檔案的檔案夾路徑—畢竟那個伺服器是在美國。如所示:
5.點擊“確定( OK)”
6. 對於聽說英文沒有困難的朋友,可以直接參考下面的連結學習如何設定:http://support.microsoft.com/kb/311503/zh-cn
等待一段很長的時間以後—因為調試器要一個個下載記事本程式所引用到的所有動態連結程式庫檔案的符號檔案,你應該可以看到類似下面的堆棧資訊:
這篇文章的描述裡面,我希望你能夠明白偵錯符號檔案的重要性:
1. 如果沒有偵錯符號檔案,那麼就不能查看堆棧—這話好像有點多餘。但是很多時候,我們在分析驗屍調試所儲存的記憶體檔案的時候,第一步要看檢查的就是,程式崩潰的時候,堆棧是什麼樣子的,如果沒有偵錯符號檔案,那我們就什麼也做不了了。
2. 那麼偵錯符號檔案是如何產生的呢?偵錯符號檔案是由編譯器產生的,因為編譯器負責將文字格式設定的原始碼檔案翻譯成二進位的程式,所以二者之間的映射關係編譯再清楚不過了。每次重新編譯的時候,編譯器都會產生對應的偵錯符號檔案。
產生偵錯符號檔案的命令:
程式設計語言 |
編譯器 |
命令列參數 |
C# |
csc.exe |
/debug[:full] |
C++/C |
cl.exe |
/Zi 或者 Link.exe的/debug選項 |
3.例如一個客戶跟你抱怨程式不能工作,出現了嚴重的錯誤(Bug),但是他正在啟動並執行是1.0版本的程式,而你們公司卻已經再開發2.0版本的程式了。由於原始碼一般都不會給客戶,這個時候如果能夠找到原始的1.0 版本的原始碼重新編譯,然後安裝到客戶機重現一下固然是好,但是為什麼不直接儲存1.0版本的偵錯符號檔案,在調試的時候,直接讓調試器自己去找原始碼呢?這裡涉及到符號檔案伺服器和原始碼檔案伺服器的合作問題,後面的文章裡可能會介紹到。
原文標題:Visual Studio調試之符號檔案
連結:http://www.cnblogs.com/killmyday/archive/2009/10/14/1582882.html