Visual Studio除錯之斷點高階篇

2022-07-29 11:21:11 字數 2748 閱讀 8025

裡面介紹了什麼是斷點,int 是intel系列cpu的乙個指令,可以讓程式產生乙個中斷或者異常。程式中如果有中斷或者異常發生了以後,cpu會中斷程式的執行,去乙個叫做idt的部件查詢處理這個中斷(或者異常)的例程(handler)。idt是作業系統在啟動的時候初始化的,至於idt的細節問題,例如什麼是idt,怎樣編寫乙個idt的例程,怎樣 初始化idt,可以去網上搜尋一些資料。

總之,這裡我們只要知道,cpu在執行程式指令過程中,碰到int 3中斷程式的執行,cpu然後去idt表裡面找到處理斷點的例程入口。這個例程要做的事情就是:

1. 先看看機器裡面是不是安裝了乙個偵錯程式—記住,這一步很重要,之所以重要以後的文章裡面會介紹。

2. 如果機器裡面沒有安裝偵錯程式,那麼作業系統就會終止程式的執行。

3. 否則作業系統啟動偵錯程式,並將偵錯程式附到程序上。

4. 這樣,我們才能在偵錯程式裡面檢查程式內部變數的值。

前面文章裡面的int 3 (或者debugbreak(),或者debugger.break())指令是我們自己在**裡面硬編碼進去的,因此我們在visual studio裡,在相應的**行裡面點一下,出現乙個小紅球,也就是說visual studio在程式指令集某個地方動態地新增了乙個int 3指令。現在的問題來了,visual studio是如何在程式中正確找到插入int 3指令的位置的?

或者更具體一些,我們在源**(文字檔案)裡面設定斷點的,visual studio需要把**行翻譯成在程式指令集中的位置。visual studio之所以需要做翻譯,是因為通常一行c++或者 c#**都會對應好幾行彙編指令。

因此,visual studio需要乙個額外的檔案來執行這個翻譯過程,這個額外的檔案叫做除錯符號檔案(symbols),是由編譯器生成的。visual studio系列的編譯器,不論是c#、vb.net還是c++編譯器都會生成這個除錯符號檔案,.pdb 檔案。所以如果你花一點時間看看debug資料夾的話,你就會發現這個檔案。

因此我們來看看visual studio支援的各種斷點,並解釋各種斷點的實現方式

條件斷點

首先我們先看看如何設定條件斷點,條件斷點有兩種,一種是根據觸發的次數來設定,另外一種是根據一條預置的條件來設定。

根據觸發次數設定

比如說,你有乙個迴圈,迴圈1000次,你知道有乙個bug總是在500次之後才會出現,因此肯定希望在迴圈內設定乙個斷點,但是前面500次都不會觸發這個斷點,否則連續按500次的f5的確不是一件輕鬆的差事。

根據預置條件來設定

如果你已經知道一些條件可能會引發bug,那麼根據條件來設定則最合適不過了。如下圖所示:

在「斷點條件(breakpoint condition)」對話方塊裡面,只需要輸入一條正常的c#、c++或者vb.net的語句就可以了(當然,語法是根據你專案裡面的源**語法一致),這條語句的要求是必須返回bool值—否則就不是乙個條件了。

第三個還有斷點過濾器,當你在斷點上,右鍵點選彈出的選單裡面,會有乙個「過濾(filter)」選單,它允許你限制將斷點僅設定在特定的執行緒上。這裡我就不細講了,有興趣的話,可以自己寫乙個多執行緒或者多程序程式試試這個功能。

知道斷點的原理以後,理解條件斷點應該就不會是問題了。

監視斷點(watching point)

有的時候,你可能需要檢視程式內部一些變數的值,但是你又不希望中斷程式的執行。例如你在除錯乙個網路協議棧,乙個程式可能在接收資料報,你想看看資料報的格式,但如果中斷程式的執行,會導致後續的資料報丟失。

因此,我們一般的做法就是在源**裡面加一些日誌記錄**,這樣可以將一些變數的值記錄下來,以便後續分析。如果日誌在產品發布以後還需要的話,在源**裡面加入這些日誌**固然是乙個好主意,但是如果你只是想臨時看看一些變數的值呢?

這個時候,監視斷點就很有用了,visual studio的監視斷點就可以讓你做到在不修改程式源**的前提下,在偵錯程式視窗中列印一些變數的值。

下圖演示了監視斷點的用法:

設定監視斷點的步驟,或者說是注意事項吧:

1. 設定乙個普通的斷點

2. 右鍵單擊剛剛設定的斷點,在彈出選單裡面選擇「when hit…」

3. 鉤選 第乙個「列印一條訊息(print a message)」核取方塊,輸入一串文字,預設情況下,你輸入的文字會被直接列印到除錯的輸出視窗裡面來。除了:

a. 以$符號開頭的幾個關鍵字。比如$function就會被替換成斷點所在的函式名。其他有一些關鍵字在「when breakpoints is hit」視窗當中有詳細的說明。

b. 使用 大括號 {}包含起來的變數名,這樣的字串會被替換成變數的值。

這下面就是監視斷點的效果,注意,你只能在visual studio的「輸出(output)」視窗中檢視結果。

監視斷點相對於日誌記錄的好處是,你不需要改動源**,並且重新編譯**。實際上visual studio實現監視斷點的原理也很簡單,就是插入乙個普通的斷點,斷點觸發之後處理並且列印在「when breakpoints is hit」視窗輸出的表示式,最後自動恢復程式的執行。

visual studio之遠端除錯

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

Visual Studio除錯之符號檔案

前面在不能設定斷點的檢查步驟和visual studio除錯之斷點高階篇提到了除錯符號檔案及其作用,這篇文章我將要介紹除錯符號檔案的一些用法,如果你已經很熟悉除錯檔案的話,盡可以跳過本文。1.設定斷點,因為偵錯程式需要符號檔案提供的對映關係,將源 行的行號轉換成對應的機器 的位址。2.檢視程式堆疊,...

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

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