在 Visual Studio 上下文中,當調試應用時,這一般意味着你在附加了調試器的狀況下(即在調試器模式下)運行應用程序。 執行此操做時,調試器在運行過程當中可提供許多方法讓你查看代碼的狀況。 你能夠逐步執行代碼、查看變量中存儲的值、設置對變量的監視以查看值什麼時候改變、檢查代碼的執行路徑等。html
斷點是可靠調試的最基本和最重要的功能。斷點指示 Visual Studio 應在哪一個位置掛起你的運行代碼,以使你能夠查看變量的值或內存的行爲,或肯定代碼的分支是否運行。要進行調試,須要在調試器附加到應用進程的狀況下啓動應用。 F5(「調試」>「開始調試」)是執行該操做最多見的方法。所以咱們首先設置斷點再開始調試。windows
按 F5(「調試」>「開始調試」)或調試工具欄中的「開始調試」按鈕 ,調試器將運行至它遇到的第一個斷點。 若是應用還沒有運行,則按 F5 會啓動調試器並在第一個斷點處中止。編輯器
要在附加了調試器的狀況下啓動應用,請按 F11(「調試」>「單步執行」)。 F11 是單步執行」命令,每按一次,應用就執行下一個語句。 使用 F11 啓動應用時,調試器會在執行的第一個語句上中斷。函數
黃色箭頭表示調試器暫停處的語句,它還在同一點上暫停應用執行(此語句還沒有執行)。工具
F11 是一種以最詳盡方式檢查執行流的好方法。 (爲了更快地瀏覽代碼,VS展現了一些其餘選項。)默認狀況下,調試器會跳過非用戶代碼(若是須要更多詳細信息,請參閱僅個人代碼)。visual-studio
在託管代碼中將看到一個對話框,詢問你是否但願在自動跳過屬性和運算符時收到通知(默認行爲)。 若稍後想更改設置,請在「調試」下的「工具」>「選項」菜單中禁用「單步跳過屬性和運算符」設置。測試
若是所在的代碼行是函數或方法調用),則能夠按 F10(「調試」>「單步跳過」)而不是 F11。ui
按 F10 將使調試器前進,但不會單步執行應用代碼中的函數或方法(代碼仍將執行)。
spa
上圖中當前程序走到32行,按下 F10 後,直接走到34行,而沒有進入到調用的方法中。debug
如前所述在默認狀況下,調試器會跳過託管屬性和字段,但經過「單步執行特定內容」命令可替代此行爲。
右鍵單擊屬性或字段,選擇「單步執行特定內容」,而後選擇一個可用選項。
在此示例中,經過「單步執行特定函數」將轉到 shape.Width 的 Set 屬性代碼處。
在調試器中,將鼠標懸停在代碼行上,直到「運行到單擊處」(將執行運行到此處)按鈕出如今左側。
自 Visual Studio 2017 起,可用使用「運行到單擊位置」(將執行運行到此處)按鈕。
低版本的VS,能夠經過如下方式達到上述效果
(1)經過鼠標拖拽「黃色箭頭」到目標位置行。
(2)參考第7步驟,「運行到光標處」功能。
單擊「運行到單擊處」(將執行運行到此處)按鈕。 調試器將前進到單擊的代碼行。 使用此按鈕相似於設置臨時斷點。 此命令對於快速到達應用代碼的可見區域也很方便。 你可在任何打開的文件中使用「運行到單擊處」。
有時你可能但願繼續調試會話,但在整個當前函數中一直使調試器前進。
按 Shift+F11(或「調試」>「單步跳出」)。
此命令將恢復應用執行(並使調試器前進),直到當前函數返回。
右鍵單擊應用中的代碼行,而後選擇「運行到光標處」。 此命令將啓動調試並在當前代碼行上設置臨時斷點。
若是設置了斷點,則調試器會在其命中的第一個斷點處暫停。
按 F5,直至到達在其上選擇了「運行到光標處」的代碼行。
當編輯代碼並但願快速設置臨時斷點並同時啓動調試器時,此命令頗有用。
調試時可以使用「調用堆棧」窗口中的「運行到光標處」。
單擊調試工具欄中的「重啓」按鈕 (Ctrl+Shift+F5)。
當你按下「重啓」時,與中止應用並重啓調試器相比,它節省了時間。 調試器在執行代碼命中的第一個斷點處暫停。
若確實要中止調試器並返回到代碼編輯器,能夠按紅色中止按鈕而不是「重啓」。
shapes 集合中有3筆記錄。循環中運行到第2次時,控制檯已經在第1次循環結束時輸出打印了內容。
此時單擊調試工具欄中的「重啓」按鈕 (Ctrl+Shift+F5),控制檯窗口關閉,當即從新開啓一個新的控制檯窗口。此過程的速度比中止調試,而後再按下F5調試的速度更快。
展開對象以查看其全部屬性(例如本示例中的 sharp 對象)。
一般,在調試時,你須要快速檢查對象的屬性值,數據提示是一種實現此目的的好方法。
在大多數受支持的語言中,可在調試會話中途編輯代碼。 有關詳細信息,請參閱編輯並繼續。
調試時,查看代碼編輯器底部的「自動」窗口。
在「自動」窗口中,可看到變量及其當前值和類型。 「自動」窗口顯示當前行或前一行使用的全部變量(在 C++ 中,該窗口顯示前三個代碼行中的變量。 查看文檔以瞭解特定於語言的行爲)。
接下來,查看「局部變量」窗口。 「局部變量」窗口顯示當前範圍中的變量。
有關詳細信息,請參閱在「自動」窗口和「局部變量」窗口中檢查變量。
在 JavaScript 中,支持「局部變量」窗口,但不支持「自動」窗口。
可以使用「監視」窗口指定要關注的變量(或表達式)。
在調試時,右鍵單擊對象並選擇「添加監視」。
在本示例中,在 sharp 對象上設置了監視,當在調試器中移動時,可看到其值發生了變化。 與其餘變量窗口不一樣,「監視」窗口始終顯示正在監視的變量(當超出範圍時,它們會變灰)。
有關詳細信息,請參閱使用「監視」窗口和「快速監視」窗口設置監視
「調用堆棧」窗口顯示方法和函數被調用的順序。 最上面一行顯示當前函數(此示例中的 Draw
方法)。 第二行顯示 Draw 是從Main 函數調用的,依此類推。 調用堆棧是檢查和理解應用執行流的好方法。
可雙擊代碼行來查看該源代碼,這也會更改調試器正在檢查的當前範圍。 此操做不會使調試器前進。
還可以使用「調用堆棧」窗口中的右鍵單擊菜單執行其餘操做。 例如,你可將斷點插入到指定的函數中,使用「運行到光標處」重啓應用,而後檢查源代碼。 請參閱如何:檢查調用堆棧。
異常幫助程序是幫助調試錯誤的好功能。 你還能夠執行其餘操做,如查看錯誤詳細信息及從異常幫助程序添加監視。 或者,若有須要可更改引起特定異常的條件。 有關如何在代碼中處理異常的詳細信息,請參閱調試技術和工具。
查看詳細信息
展開「異常設置」節點以查看有關如何處理此異常類型的更多選項。異常設置 -> 編輯條件
若是在調試會話期間發現一個要在代碼中測試的更改,則也能夠執行此操做。
單擊 c2.First.Value
的第二個實例且將 c2.First.Value
更改成 c2.Last.Value
。
屢次按 F10(或「調試」>「單步跳過」),向前移動調試器並執行已編輯的代碼。
F10 一次使調試器前進一個語句,可是是跳過函數而不是單步執行它們(跳過的代碼仍然執行)。
調試器暫停時,對源代碼的邊距中的黃色箭頭或反彙編窗口標記要執行的下一個語句的位置。 你能夠經過移動此箭頭執行的下一個語句。 能夠跳過了一部分代碼,或返回到上一代碼行。 移動指針可用於如跳過包含已知的 bug 的代碼部分的狀況。
若要更改要執行的下一個語句,調試器必須處於中斷模式。 在源代碼中或反彙編窗口中,將黃色箭頭拖到不一樣的行,或右鍵單擊你想要執行的下和選擇的行設置下一語句。
程序計數器直接跳轉到新位置,並說明舊的和新執行點之間不會執行。 可是,若是向後移動執行點,則不撤消插入的指令。
一、將下一條語句移動到另外一個函數或範圍一般會致使調用堆棧損壞,致使一個運行時錯誤或異常。 若是嘗試將下一條語句移動到另外一個範圍,則調試器將打開一個含有警告的對話框,並提供一個取消該操做的機會。
二、當啓用「編輯並繼續」時,若是你進行了「編輯並繼續」沒法當即從新映射的編輯,那麼 「設置下一語句」 將失敗。 例如,若是你編輯了 catch 塊中的代碼,將發生這種狀況。 在此狀況下,會顯示錯誤消息,告知你不支持該操做。
在託管代碼中,您不能移動下一個語句,若是:
(1)下一條語句與當前語句不在同一個方法中。
(2)在實時調試啓動調試。
(3)正在進行的調用堆棧展開。
(4)已引起一個 System.StackOverflowException 或 System.Threading.ThreadAbortException 異常