新聞中心
對(duì)于Visual Studio調(diào)試過(guò)程中的一些步驟,我們今天需要了解的是符號(hào)文件,希望通過(guò)本文,能為大家的工作起到事半功倍的效果。

10年積累的成都網(wǎng)站設(shè)計(jì)、做網(wǎng)站經(jīng)驗(yàn),可以快速應(yīng)對(duì)客戶(hù)對(duì)網(wǎng)站的新想法和需求。提供各種問(wèn)題對(duì)應(yīng)的解決方案。讓選擇我們的客戶(hù)得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認(rèn)識(shí)你,你也不認(rèn)識(shí)我。但先網(wǎng)站制作后付款的網(wǎng)站建設(shè)流程,更有撫寧免費(fèi)網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。
前面在不能設(shè)置斷點(diǎn)的檢查步驟和Visual Studio調(diào)試之?dāng)帱c(diǎn)進(jìn)階篇提到了調(diào)試符號(hào)文件及其作用,這篇文章我將要介紹調(diào)試符號(hào)文件的一些用法,如果你已經(jīng)很熟悉調(diào)試文件的話(huà),盡可以跳過(guò)本文。
調(diào)試符號(hào)文件為調(diào)試器提供了從二進(jìn)制機(jī)器代碼地址到源代碼文本文件代碼行的映射.因此有了符號(hào)文件,我們才能:
1. 設(shè)置斷點(diǎn),因?yàn)檎{(diào)試器需要符號(hào)文件提供的映射關(guān)系,將源代碼行的行號(hào)轉(zhuǎn)換成對(duì)應(yīng)的機(jī)器代碼的地址。
2. 查看程序堆棧,簡(jiǎn)單地說(shuō),就是調(diào)試器使用映射關(guān)系將堆棧里面的地址轉(zhuǎn)換成包含這個(gè)地址的函數(shù)名。
3. 查看變量的值,對(duì)于機(jī)器來(lái)說(shuō),所有的變量都只是一個(gè)內(nèi)存地址,程序在讀取變量值的時(shí)候,只不過(guò)按照變量所屬的類(lèi)型來(lái)讀取指定大小的內(nèi)存而已。
4. 甚至調(diào)用程序的一些函數(shù),比如原生(Native)程序,經(jīng)過(guò)編譯以后,在程序里面實(shí)際上只變成了一段機(jī)器代碼。我們?cè)诹⒓创翱诶锩嬲{(diào)用一個(gè)C++函數(shù)的時(shí)候,調(diào)試器需要將函數(shù)名翻譯成對(duì)應(yīng)的機(jī)器代碼的起始地址,當(dāng)然還要遵循一定的函數(shù)調(diào)用規(guī)則才能調(diào)用這個(gè)函數(shù)。
我們一個(gè)一個(gè)地看符號(hào)文件的功能:
查看程序堆棧
將Visual Studio以原生程序(Native)調(diào)試模式附加到一個(gè)已打開(kāi)的記事本程序上(附:因?yàn)槲业南到y(tǒng)都是英文版,所以中文菜單都是對(duì)著英語(yǔ)直接翻譯的,有的會(huì)翻譯的不準(zhǔn)確,所以我會(huì)把英文的命令附在后面),然后中斷記事本進(jìn)程的執(zhí)行 — 通過(guò)點(diǎn)擊VS菜單里面的“調(diào)試(Debug)”-“全部中斷(Break All)”。
下面是具體的將VS附加到記事本進(jìn)程的操作(不好意思,錄制的視頻太大,不知道怎么傳)。
1. 點(diǎn)擊Visual Studio里面的“工具(Tools)”- “附加到進(jìn)程……(Attach to Process …)”。
2. 選擇notepad.exe,當(dāng)然你要保證“附加到… (Attach To…)” 文本框里面列出的調(diào)試類(lèi)型是“原生程序(Native)”。
3.點(diǎn)擊確定以后,將Visual Studio附加到剛剛打開(kāi)的記事本進(jìn)程。
這個(gè)時(shí)候打開(kāi)堆棧(Stack)窗口,你應(yīng)該會(huì)看到類(lèi)似下面的結(jié)果:
上面的堆棧,我也看不懂(我的機(jī)器是64位的Windows 7,所以地址都是8個(gè)字節(jié)的)。因此我們需要一些東西來(lái)幫我們把難理解的地址(鳥(niǎo)語(yǔ))翻譯成有意義的文字,這個(gè)工作就是由符號(hào)文件來(lái)完成的。
因?yàn)橛浭卤臼遣僮飨到y(tǒng)自帶的程序,我們當(dāng)然沒(méi)有辦法自己生成它對(duì)應(yīng)的符號(hào)文件啦,但是幸運(yùn)的是,微軟早就已經(jīng)考慮到可能有一些人需要調(diào)試Windows內(nèi)核—例如寫(xiě)驅(qū)動(dòng)程序的程序員,因此微軟公司已經(jīng)將Windows的一些符號(hào)文件公開(kāi)了,公開(kāi)的地址在:
http://msdl.microsoft.com/download/symbols
在Visual Studio里使用的方法是:
1.點(diǎn)擊菜單欄里面的“工具(Tools)”—“選項(xiàng)(Options)”。
2.在“選項(xiàng)(Options)”對(duì)話(huà)框左邊的列表框里面選擇“調(diào)試(Debugging)”-“符號(hào)文件(Symbols)”。
3.如果你的Visual Studio是Visual Studio 2008 SP 1,那么點(diǎn)擊“從微軟的符號(hào)文件服務(wù)器上加載符號(hào)文件(Load symbols from Microsoft symbols server)”就可以了。
4. 如果是其他版本-當(dāng)然是低一些的版本,在右側(cè)的“符號(hào)文件路徑(Symbol file (.pdb) locations)”列表框里面添加新的一行,將上面的鏈接輸入進(jìn)去。
然后在“將符號(hào)文件緩存到這個(gè)文件夾(Cache symbols from symbol servers to this directory:)”文本框里輸入你要緩存從服務(wù)器下載的符號(hào)文件的文件夾路徑—畢竟那個(gè)服務(wù)器是在美國(guó)。如下圖所示:
5.點(diǎn)擊“確定( OK)”
6. 對(duì)于聽(tīng)說(shuō)英文沒(méi)有困難的朋友,可以直接參考下面的鏈接學(xué)習(xí)如何設(shè)置:http://support.microsoft.com/kb/311503/zh-cn
等待一段很長(zhǎng)的時(shí)間以后—因?yàn)檎{(diào)試器要一個(gè)個(gè)下載記事本程序所引用到的所有動(dòng)態(tài)鏈接庫(kù)文件的符號(hào)文件,你應(yīng)該可以看到類(lèi)似下面的堆棧信息:
這篇文章的描述里面,我希望你能夠明白調(diào)試符號(hào)文件的重要性:
1. 如果沒(méi)有調(diào)試符號(hào)文件,那么就不能查看堆棧—這話(huà)好像有點(diǎn)多余。但是很多時(shí)候,我們?cè)诜治鲵?yàn)尸調(diào)試所保存的內(nèi)存文件的時(shí)候,第一步要看檢查的就是,程序崩潰的時(shí)候,堆棧是什么樣子的,如果沒(méi)有調(diào)試符號(hào)文件,那我們就什么也做不了了。
2. 那么調(diào)試符號(hào)文件是如何生成的呢?調(diào)試符號(hào)文件是由編譯器生成的,因?yàn)榫幾g器負(fù)責(zé)將文本格式的源代碼文件翻譯成二進(jìn)制的程序,所以二者之間的映射關(guān)系編譯再清楚不過(guò)了。每次重新編譯的時(shí)候,編譯器都會(huì)生成對(duì)應(yīng)的調(diào)試符號(hào)文件。
生成調(diào)試符號(hào)文件的命令:
|
編程語(yǔ)言 |
編譯器 |
命令行參數(shù) |
|
C# |
csc.exe |
/debug[:full] |
|
C++/C |
cl.exe |
/Zi 或者 Link.exe的/debug選項(xiàng) |
3.例如一個(gè)客戶(hù)跟你抱怨程序不能工作,出現(xiàn)了嚴(yán)重的錯(cuò)誤(Bug),但是他正在運(yùn)行的是1.0版本的程序,而你們公司卻已經(jīng)再開(kāi)發(fā)2.0版本的程序了。由于源代碼一般都不會(huì)給客戶(hù),這個(gè)時(shí)候如果能夠找到原始的1.0 版本的源代碼重新編譯,然后安裝到客戶(hù)機(jī)重現(xiàn)一下固然是好,但是為什么不直接保存1.0版本的調(diào)試符號(hào)文件,在調(diào)試的時(shí)候,直接讓調(diào)試器自己去找源代碼呢?這里涉及到符號(hào)文件服務(wù)器和源代碼文件服務(wù)器的合作問(wèn)題,后面的文章里可能會(huì)介紹到。
鏈接:http://www.cnblogs.com/killmyday/archive/2009/10/14/1582882.html
分享文章:詳解VisualStudio調(diào)試中符號(hào)文件的作用
本文來(lái)源:http://www.5511xx.com/article/djigsjd.html


咨詢(xún)
建站咨詢(xún)
