本快速入門演示如何在 Visual Studio 調試會話中導航,以及如何在會話中查看和更改程序狀態。編程
本 快速入門適用於不熟悉用 Visual Studio 進行調試的開發人員,以及要詳細瞭解在 Visual Studio 調試會話中導航的開發人員。但其中不傳授調試自己的技藝。示例代碼中的方法僅爲演示本主題中所述的調試過程。這些方法並未採用應用程序或函數設計的最佳實 踐。實際上,您將快速瞭解這些方法和應用程序自己,但並不深刻研究任何內容。瀏覽器
本快速入門的各節旨在儘量獨立,以使您可跳過其中含有已熟悉信息的任意一節。同時,您也不須要建立示例應用程序;可是,咱們建議這樣作,並已使該過程儘量簡便易行。安全
調試器鍵盤快捷鍵。Visual Studio 調試器導航同時針對鼠標和鍵盤進行了優化。本主題中的許多步驟都加入了括號括起的鍵盤快捷鍵。例如,(鍵盤:F5)表示按 F5 鍵將開始或繼續執行調試器。app
調試涉及到代碼,所以,示例應用程序使用 Windows 應用商店應用程序的框架只是爲了建立一個源文件,從中可瞭解在調試會話中導航的工做方式以及如何檢查和更改程序狀態。將調用的全部代碼均從主頁的構造函數中進行調用;不添加控件,也不處理事件。
建立默認 C# Windows 應用商店應用程序。打開 Visual Studio。在主頁上,選擇「新建項目」連接。在「新建項目」對話框中的「已安裝」列表中選擇「Visual C#」,而後選擇「Windows 應用商店」。在項目模板的列表中,選擇「應用程序」。隨後 Visual Studio 將建立一個新的解決方案和項目,並顯示 MainPage.xaml 設計器和 XAML 代碼編輯器。
打開 MainPage.xaml.cs 源文件。右擊 XAML 編輯器中的任意位置,而後選擇「查看代碼」。隨後將顯示 MainPage.xaml.cs 代碼隱藏文件。注意,該文件中僅列出一個方法,即 MainPage() 構造函數。
將 MainPage 構造函數替換爲示例代碼。刪除 MainPage() 方法。訪問此連接:調試器導航示例代碼(XAML 和 C#),而後將 C# 部分中列出的代碼複製到剪貼板。(在瀏覽器中選擇「返回」或幫助查看器返回本快速入門頁。)在 Visual Studio 編輯器中,將這段代碼粘貼到 partial class MainPage 塊中。選擇 CTRL + s 以保存文件。
如今便可實踐本主題中的示例。
最經常使用於啓動調試會話的方法是從「調試」菜單中選擇「啓動調試」(鍵盤:F5)。隨後開始執行,並持續執行至抵達某個斷點、手動暫停執行、發生異常或應用程序結束爲止。
在調試器中暫停執行後,可經過將鼠標懸停在某個活動變量上,在數據提示中查看該變量的值。還可打開「局部變量」和「自動窗口」窗口以查看活動變量及其當前值的列表。將一個或多個變量添加到監視窗口後,可在應用程序繼續執行時將精力集中到變量的值上。
暫 停應用程序的執行(也稱爲中斷到調試器中)以後,可控制其他程序代碼的執行方式。可繼續逐行執行,同時從方法調用移至該方法自己,也可在一個步驟中執行一 個被調用的方法。在逐句經過應用程序時調用這些過程。還可恢復應用程序的標準執行,並運行到已設置的下一個斷點或運行到放置光標的行。可隨時中止調試會 話。調試器旨在執行必要的清理操做並退出執行。
此示例中,在 MainPage.xaml.cs 文件的 MainPage 構造函數中設置一個斷點,逐語句執行第一個方法,查看變量值,而後中止調試。
設置斷點。在 MainPage 構造函數的語句 methodTrack = "Main Page"; 處設置一個斷點。在源代碼編輯器的陰影裝訂線中選擇該行(鍵盤:將光標放置在該行上,而後選擇 F9 鍵)。
隨後在裝訂線中顯示該斷點圖標。
運行到該斷點。經過在「調試」菜單上選擇「啓動調試」(鍵盤:F5),啓動調試會話。
應用程序開始執行,而後在緊接設置了斷點的語句以前暫停執行。裝訂線中的當前行圖標指出您所在的位置,而且當前語句爲突出顯示。
如今由您控制應用程序的執行,可在逐句經過各個程序語句時檢查程序狀態。
逐語句執行該方法。在「調試」菜單上,選擇「逐語句」(鍵盤:F11)。
注意,調試器將移至下一行,即調用 Example1 方法。再次選擇「逐語句」。隨後調試器將移至 Example1 方法的入口點。這表示已在調用堆棧上加載了該方法,而且已分配了用於局部變量的內存。
當逐語句執行某行代碼時,調試器執行如下操做之一:
若是下一個語句不調用您的解決方案中的函數,則調試器執行該語句,移至下一個語句,而後暫停執行。
若是該語句調用您的解決方案中的函數,則調試器將移至被調用函數的入口點,而後暫停執行。
繼續逐語句執行 Example1 的語句,直至抵達退出點。調試器突出顯示該方法的右大括號。
在數據提示中檢查變量值。將鼠標懸停在變量名稱上時,數據提示中顯示該變量的名稱、值和類型。
將鼠標懸停在變量 a 上。請注意名稱、值和數據類型。將鼠標懸停在變量 methodTrack 上。請再次注意名稱、值和數據類型。
在「局部變量」窗口中檢查變量值。在「調試」菜單上,指向「窗口」,而後選擇「局部變量」。(鍵盤:Alt+4)。
「局部變量」窗口是函數的參數和變量的一個樹視圖。對象變量的屬性是對象自身的子節點。this 變量是每一個對象方法中表示對象自身的一個隱藏參數。在本例下,它表示 MainPage 類。因爲 methodTrack 是 MainPage 類的成員,所以其值和數據類型在 this 下的某行中列出。展開 this 節點以查看 methodTrack 信息。
添加針對 methodTrack 變量的監視。本快速入門中全程使用 methodWatch 變量展現在示例中調用的方法。若要更方便地查看該變量的值,請將其添加到某個監視窗口中。在「局部變量」窗口中右擊該變量名稱,而後選擇「添加監視」。
可在一個監視窗口中監視多個變量。只要暫停執行,被監視變量的值(如「局部變量」和數據提示窗口中的值)就會更新。還可從代碼編輯器中向監視窗口添加變量。選擇要監視的變量,右擊,而後選擇「添加監視」。
與逐語句執行由父方法調用的某個方法造成對照的是,逐過程執行某個方法將執行子方法,而後當父方法繼續執行時,在調用方法中暫停執行。當熟悉某個方法的工做方式並確信執行它不會影響所調查的問題時,可逐過程執行該方法。
逐過程執行某行不包含方法調用的代碼時,執行該行如同逐語句執行該行同樣。
跳出子方法將繼續執行該方法,而後在該方法返回其調用方法後暫停執行。肯定某個較長函數的其他部分可有可無時,可跳出該函數。
逐過程執行和跳出函數都會執行該函數。
在此示例中,將逐語句執行、逐過程執行和跳出方法。
在 MainPage 構造函數中調用 Example2 方法。編輯 MainPage 構造函數,將 methodTrack = String.Empty; 以後的一行替換爲 Example2();。
運行到該斷點。經過在「調試」菜單上選擇「啓動調試」(鍵盤:F5),啓動調試會話。調試器在斷點處暫停執行。
逐過程執行該行代碼。在「調試」菜單上,選擇「逐過程」(鍵盤:F10)。調試器按照與逐語句執行 methodTrack = "MainPage"; 語句相同的方式執行該語句。
逐語句執行 Example2 和 Example2_A。選擇 F11 鍵以逐語句執行 Example2 方法。繼續逐語句執行 Example2 的語句,直至抵達行 int x = Example2_A();。一樣,逐語句執行此行以移至 Example2_A 的入口點。繼續逐語句執行 Example2_A 的每一個語句,直至返回 Example2。
逐過程執行函數。注意,Example2 中的下一行 int y = Example2_A(); 與上一行基本相同。可安全地逐過程執行此行。選擇 F10 鍵,從 Example2 的繼續執行移至對 Example2_A 的第二次調用。選擇 F10 以逐過程執行此方法。注意,methodTrack 字符串指示 Example2_A 方法執行了兩次。還會注意到調試器當即移至下一行。而不會在 Example2 恢復時暫停執行。
跳出函數。選擇 F11 鍵以逐語句執行 Example2_B 方法。注意,Example2_B 與 Example2_A 區別不大。若要跳出該方法,請在「調試」菜單上選擇「跳出」(鍵盤:Shift + F11)。注意,methodTrack 變量指示已執行 Example2_B,而且調試器已返回 Example2 繼續執行的那一點。
中止調試。在「調試」菜單上,選擇「中止調試」(鍵盤:Shift+F5)。這樣將結束調試會話。
條件斷點指定一種致使調試器暫停執行的狀況。該條件由任何可得出 true 或 false 的代碼表達式指定。例如,可以使用某個條件斷點,僅當變量達到某個值時,纔在頻繁調用的方法中檢查程序狀態。
運行到光標處相似於設置一次性斷點。暫停執行後,可在源代碼中選擇一行,而後繼續執行,直至抵達所選行。例如,可逐句經過方法中的某個循環,而後肯定該循環中的代碼執行正確。可運行到放置在循環執行後的光標處,而沒必要逐句經過循環的每次迭代。
有時,在數據提示所在行或變量窗口中難以查看變量值。調試器可在文本可視化工具中顯示字符串、HTML 和 XML,該工具在一個可滾動的窗口中呈現該值的格式化視圖。
此示例中設置一個條件斷點,在某個循環的特定迭代處中斷,而後運行到放置在該循環後的光標。還可在文本可視化工具中查看變量的值。
在 MainPage 構造函數中調用 Example3 方法。編輯 MainPage 構造函數,將 methodTrack = String.Empty; 以後的一行替換爲行 Example3();。
運行到該斷點。經過在「調試」菜單上選擇「啓動調試」(鍵盤:F5),啓動調試會話。調試器在 MainPage 方法中的斷點處暫停執行。
逐語句執行 Example3 方法。在「調試」菜單上選擇「逐語句」(鍵盤:F11)以移至 Example3 方法的入口點。繼續逐語句執行該方法,直至已迭代 for 塊的一個或兩個循環。注意,逐語句執行所有 1000 次迭代須要很長時間。
設置條件斷點。在代碼窗口的左側裝訂線中,右擊行 x += i;,而後選擇「條件」。選中「條件」複選框,而後在文本框中鍵入 i == 500;。選擇「爲 true」選項,而後選擇「肯定」。經過該斷點,可在 for 循環的第 500 次迭代時檢查該值。
可經過白色十字識別條件斷點圖標。
運行到該斷點。在「調試」菜單上,選擇「繼續」(鍵盤:F5)。在「局部變量」窗口中,確認 i 的當前值爲 500。請注意,變量 s 顯示爲一行,而且長度超出窗口許多。
使字符串變量可視化。單擊 s 的「值」列中的放大鏡圖標。
隨後將顯示「文本可視化工具」窗口,而該字符串的值呈現爲一個多行字符串。
運行到光標處。右擊行 methodTrack += "->Example3";,而後選擇「運行到光標處」(鍵盤:將光標移至該行;Ctrl + F10)。調試器完成循環迭代,而後在該行暫停執行。
中止調試。在「調試」菜單上,選擇「中止調試」(鍵盤:Shift+F5)。這樣將結束調試會話。
在某些狀況下,在 Visual Studio 調試器中進入代碼後,可更改變量的值,甚至可更改語句的邏輯。此功能稱爲「編輯並繼續」。
在異常處中斷時,「編輯並繼續」可能尤其有用。如今沒必要爲避免異常而中止再從新開始調試冗長且複雜的過程,可「展開」異常,使執行移至以即將發生異常以前的那一點,而後更改有問題的變量或語句,接着在不會引起異常的狀態下繼續進行當前的調試會話。
盡 管在許多狀況下都可使用「編輯並繼續」,但難以指定不支持「編輯並繼續」的特定狀況,由於這些狀況取決於編程語言、程序堆棧的當前狀態以及調試器可否在不 損壞進程的狀況下更改狀態。肯定是否支持編輯更改的最佳方法就是嘗試進行該更改;在調試器中可當即知道是否支持該更改。
在此示例中,將調試器運行到某個異常,後退異常,更正該方法的邏輯,而後更改某個變量的值,以使您可繼續執行該方法。
在 MainPage 構造函數中調用 Example4 方法。編輯 MainPage() 構造函數,將 methodTrack = String.Empty; 以後的一行替換爲行 Example4();。
運行到該異常。經過在「調試」菜單上選擇「啓動調試」(鍵盤:F5),啓動調試會話。再次按 F5 以繼續執行。調試器在 Example4 方法中的異常處暫停執行,並顯示一個異常對話框。
更改程序邏輯。很明顯,錯誤發生在 if 條件中:當 x 等於 0 時應更改 x 的值;但 x 不等於零時不該更改該值。選擇「中斷」修復該方法的邏輯。當嘗試編輯該行時,將顯示另外一個對話框。
選擇「編輯」,而後將行 if (x != 0) 更改成 if (x == 0)。調試器將程序邏輯的更改保留到源文件。
更改變量值。在數據提示中或「局部變量」窗口中檢查 x 的值。它仍爲 0(零)。若是嘗試執行曾致使原始異常的語句,則只會再次引起該異常。可更改 x 的值。在「局部變量」窗口中,雙擊 x 行的「值」列。將該值從 0 更改成 1。
選擇 F11 鍵以逐語句執行原先曾引起異常的語句。注意,該行執行時再也不出錯。再次選擇 F11。
中止調試。在「調試」菜單上,選擇「中止調試」(鍵盤:Shift+F5)。這樣將結束調試會話。