在 Visual Studio 上下文中,當調試應用時,這通常意味着你在附加了調試器的情況下(即在調試器模式下)運行應用程序。 執行此操作時,調試器在運行過程中可提供許多方法讓你查看代碼的情況。 你可以逐步執行代碼、查看變量中存儲的值、設置對變量的監視以查看值何時改變、檢查代碼的執行路徑等。
斷點是可靠調試的最基本和最重要的功能。斷點指示 Visual Studio 應在哪個位置掛起你的運行代碼,以使你可以查看變量的值或內存的行為,或確定代碼的分支是否運行。要進行調試,需要在調試器附加到應用進程的情況下啟動應用。 F5(“調試”>“開始調試”)是執行該操作最常見的方法。因此我們首先設置斷點再開始調試。

按 F5(“調試”>“開始調試”)或調試工具欄中的“開始調試”按鈕 ,調試器將運行至它遇到的第一個斷點。 如果應用尚未運行,則按 F5 會啟動調試器並在第一個斷點處停止。
要在附加了調試器的情況下啟動應用,請按 F11(“調試”>“單步執行”)。 F11 是單步執行”命令,每按一次,應用就執行下一個語句。 使用 F11 啟動應用時,調試器會在執行的第一個語句上中斷。

黃色箭頭表示調試器暫停處的語句,它還在同一點上暫停應用執行(此語句尚未執行)。
F11 是一種以最詳盡方式檢查執行流的好方法。 (為了更快地瀏覽代碼,VS展示了一些其他選項。)默認情況下,調試器會跳過非用戶代碼(如果需要更多詳細信息,請參閱僅我的代碼)。
在托管代碼中將看到一個對話框,詢問你是否希望在自動跳過屬性和運算符時收到通知(默認行為)。 若稍后想更改設置,請在“調試”下的“工具”>“選項”菜單中禁用“單步跳過屬性和運算符”設置。
如果所在的代碼行是函數或方法調用),則可以按 F10(“調試”>“單步跳過”)而不是 F11。
按 F10 將使調試器前進,但不會單步執行應用代碼中的函數或方法(代碼仍將執行)。
上圖中當前程序走到32行,按下 F10 后,直接走到34行,而沒有進入到調用的方法中。
如前所述在默認情況下,調試器會跳過托管屬性和字段,但通過“單步執行特定內容”命令可替代此行為。
右鍵單擊屬性或字段,選擇“單步執行特定內容”,然后選擇一個可用選項。
在此示例中,通過“單步執行特定函數”將轉到 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 的代碼部分的情況。
若要更改要執行的下一個語句,調試器必須處於中斷模式。 在源代碼中或反匯編窗口中,將黃色箭頭拖到不同的行,或右鍵單擊你想要執行的下和選擇的行設置下一語句。
程序計數器直接跳轉到新位置,並說明舊的和新執行點之間不會執行。 但是,如果向后移動執行點,則不撤消插入的指令。
1、將下一條語句移動到另一個函數或范圍通常會導致調用堆棧損壞,導致一個運行時錯誤或異常。 如果嘗試將下一條語句移動到另一個范圍,則調試器將打開一個含有警告的對話框,並提供一個取消該操作的機會。
2、當啟用“編輯並繼續”時,如果你進行了“編輯並繼續”無法立即重新映射的編輯,那么 “設置下一語句” 將失敗。 例如,如果你編輯了 catch 塊中的代碼,將發生這種情況。 在此情況下,會顯示錯誤消息,告知你不支持該操作。
在托管代碼中,您不能移動下一個語句,如果:
(1)下一條語句與當前語句不在同一個方法中。
(2)在實時調試啟動調試。
(3)正在進行的調用堆棧展開。
(4)已引發一個 System.StackOverflowException 或 System.Threading.ThreadAbortException 異常