Visual Studio除錯之符號檔案

2022-07-29 11:21:11 字數 2258 閱讀 5634

前面在不能設定斷點的檢查步驟和visual studio除錯之斷點高階篇提到了除錯符號檔案及其作用,這篇文章我將要介紹除錯符號檔案的一些用法,如果你已經很熟悉除錯檔案的話,盡可以跳過本文。

1. 設定斷點,因為偵錯程式需要符號檔案提供的對映關係,將源**行的行號轉換成對應的機器**的位址。

2. 檢視程式堆疊,簡單地說,就是偵錯程式使用對映關係將堆疊裡面的位址轉換成包含這個位址的函式名。

3. 檢視變數的值,對於機器來說,所有的變數都只是乙個記憶體位址,程式在讀取變數值的時候,只不過按照變數所屬的型別來讀取指定大小的記憶體而已。

4. 甚至呼叫程式的一些函式,比如原生(native)程式,經過編譯以後,在程式裡面實際上只變成了一段機器**。我們在立即視窗裡面呼叫乙個c++函式的時候,偵錯程式需要將函式名翻譯成對應的機器**的起始位址,當然還要遵循一定的函式呼叫規則才能呼叫這個函式。

我們乙個乙個地看符號檔案的功能:

檢視程式堆疊

將visual studio以原生程式(native)除錯模式附加到乙個已開啟的記事本程式上(附:因為我的系統都是英文版,所以中文選單都是對著英語直接翻譯的,有的會翻譯的不準確,所以我會把英文的命令附在後面),然後中斷記事本程序的執行 — 通過點選vs選單裡面的「除錯(debug)」-「全部中斷(break all)」。

1. 點選visual studio裡面的「工具(tools)」- 「附加到程序……(attach to process …)」。

2. 選擇notepad.exe,當然你要保證「附加到… (attach to…)」 文字框裡面列出的除錯型別是「原生程式(native)」。

3. 點選確定以後,將visual studio附加到剛剛開啟的記事本程序。

這個時候開啟堆疊(stack)視窗,你應該會看到類似下面的結果:

上面的堆疊,我也看不懂(我的機器是64位的windows 7,所以位址都是8個位元組的)。因此我們需要一些東西來幫我們把難理解的位址(鳥語)翻譯成有意義的文字,這個工作就是由符號檔案來完成的。

因為記事本是作業系統自帶的程式,我們當然沒有辦法自己生成它對應的符號檔案啦,但是幸運的是,微軟早就已經考慮到可能有一些人需要除錯windows核心—例如寫驅動程式的程式設計師,因此微軟公司已經將windows的一些符號檔案公開了,公開的位址在:

在 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)」列表框裡面新增新的一行,將上面的鏈結輸入進去。

5. 點選「確定( ok)」

1. 如果沒有除錯符號檔案,那麼就不能檢視堆疊—這話好像有點多餘。但是很多時候,我們在分析驗屍除錯所儲存的記憶體檔案的時候,第一步要看檢查的就是,程式崩潰的時候,堆疊是什麼樣子的,如果沒有除錯符號檔案,那我們就什麼也做不了了。

2. 那麼除錯符號檔案是如何生成的呢?除錯符號檔案是由編譯器生成的,因為編譯器負責將文字格式的源**檔案翻譯成二進位制的程式,所以二者之間的對映關係編譯再清楚不過了。每次重新編譯的時候,編譯器都會生成對應的除錯符號檔案。

生成除錯符號檔案的命令:

3. 例如乙個客戶跟你抱怨程式不能工作,出現了嚴重的錯誤(bug),但是他正在執行的是1.0版本的程式,而你們公司卻已經再開發2.0版本的程式了。由於源**一般都不會給客戶,這個時候如果能夠找到原始的1.0 版本的源**重新編譯,然後安裝到客戶機重現一下固然是好,但是為什麼不直接儲存1.0版本的除錯符號檔案,在除錯的時候,直接讓偵錯程式自己去找源**呢?這裡涉及到符號檔案伺服器和源**檔案伺服器的合作問題,後面的文章裡可能會介紹到。

visual studio之遠端除錯

遠端除錯需要以下幾個步驟 1 在遠端裝置上安裝remote debugger,啟動,選擇tools options,設定為no authenication,勾選allow any user to debug,並將maximum idle time設為0 即可以一直閒置而不會自動退出程序 2 本地裝置...

Visual Studio除錯之斷點技巧篇補遺

講完 visual studio除錯之斷點技巧篇 以後,翻翻以前看得一些資料和自己寫的一些文章,發現還有幾個關於中斷程式的技巧在前面的文章裡面遺漏了,決定還是在這裡總結一下。當然啦,如果你知道這些技巧,忽略這篇文章好了,可能有人會對這個問題有一些爭議,因為大部分情況下我們只需要在偵錯程式 debug...

Visual Studio除錯之斷點基礎篇

我曾經問過很多人,你一般是怎麼除錯你的程式的?f9,f5,f11,f 有很多書和文章都是介紹怎麼使用visual studio編寫winform啦,asp.net之類的程式 知道如何編寫固然重要,但是我覺得程式設計師可能只會花費30 的時間在編寫 上,剩下的大部分時間都是在除錯程式。在網上看到很多人...