天天看點

C#調試器導航

本快速入門示範如何在 Visual Studio 調試會話中導航,以及如何在會話中檢視和更改程式狀态。

本 快速入門适用于不熟悉用 Visual Studio 進行調試的開發人員,以及要詳細了解在 Visual Studio 調試會話中導航的開發人員。但其中不傳授調試本身的技藝。示例代碼中的方法僅為示範本主題中所述的調試過程。這些方法并未采用應用程式或函數設計的最佳實 踐。實際上,您将快速了解這些方法和應用程式本身,但并不深入研究任何内容。

本快速入門的各節旨在盡可能獨立,以使您可跳過其中含有已熟悉資訊的任意一節。同時,您也不需要建立示例應用程式;但是,我們建議這樣做,并已使該過程盡可能簡便易行。

調試器鍵盤快捷鍵。Visual Studio 調試器導航同時針對滑鼠和鍵盤進行了優化。本主題中的許多步驟都加入了括号括起的鍵盤快捷鍵。例如,(鍵盤:F5)表示按 F5 鍵将開始或繼續執行調試器。

 在本主題中

可了解如何:

  • Create the sample app
  • Set and run to a breakpoint, step into a method, and examine program data
  • Step into, over, and out of methods
  • Set a conditional breakpoint, run to the cursor, and visualize a variable
  • Edit and continue, recover from an exception

 建立示例應用程式

調試涉及到代碼,是以,示例應用程式使用 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)。随後開始執行,并持續執行至抵達某個斷點、手動暫停執行、發生異常或應用程式結束為止。

在調試器中暫停執行後,可通過将滑鼠懸停在某個活動變量上,在資料提示中檢視該變量的值。還可打開“局部變量”和“自動視窗”視窗以檢視活動變量及其目前值的清單。将一個或多個變量添加到監視視窗後,可在應用程式繼續執行時将精力集中到變量的值上。

暫 停應用程式的執行(也稱為中斷到調試器中)之後,可控制其餘程式代碼的執行方式。可繼續逐行執行,同時從方法調用移至該方法本身,也可在一個步驟中執行一 個被調用的方法。在逐句通過應用程式時調用這些過程。還可恢複應用程式的标準執行,并運作到已設定的下一個斷點或運作到放置光标的行。可随時停止調試會 話。調試器旨在執行必要的清理操作并退出執行。

示例 1

此示例中,在 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 變量展示在示例中調用的方法。若要更友善地檢視該變量的值,請将其添加到某個監視視窗中。在“局部變量”視窗中右擊該變量名稱,然後選擇“添加監視”。

可在一個監視視窗中監視多個變量。隻要暫停執行,被監視變量的值(如“局部變量”和資料提示視窗中的值)就會更新。還可從代碼編輯器中向監視視窗添加變量。選擇要監視的變量,右擊,然後選擇“添加監視”。

 逐語句執行、逐過程執行和跳出方法

與逐語句執行由父方法調用的某個方法形成對照的是,逐過程執行某個方法将執行子方法,然後當父方法繼續執行時,在調用方法中暫停執行。當熟悉某個方法的工作方式并确信執行它不會影響所調查的問題時,可逐過程執行該方法。

逐過程執行某行不包含方法調用的代碼時,執行該行如同逐語句執行該行一樣。

跳出子方法将繼續執行該方法,然後在該方法傳回其調用方法後暫停執行。确定某個較長函數的其餘部分無關緊要時,可跳出該函數。

逐過程執行和跳出函數都會執行該函數。

示例 2

在此示例中,将逐語句執行、逐過程執行和跳出方法。

在 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,該工具在一個可滾動的視窗中呈現該值的格式化視圖。

示例 3

此示例中設定一個條件斷點,在某個循環的特定疊代處中斷,然後運作到放置在該循環後的光标。還可在文本可視化工具中檢視變量的值。

在 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)。調試器完成循環疊代,然後在該行暫停執行。

 編輯并繼續,從異常恢複

在某些情況下,在 Visual Studio 調試器中進入代碼後,可更改變量的值,甚至可更改語句的邏輯。此功能稱為“編輯并繼續”。

在異常處中斷時,“編輯并繼續”可能尤為有用。現在不必為避免異常而停止再重新開始調試冗長且複雜的過程,可“展開”異常,使執行移至以即将發生異常之前的那一點,然後更改有問題的變量或語句,接着在不會引發異常的狀态下繼續進行目前的調試會話。

盡 管在許多情況下均可使用“編輯并繼續”,但難以指定不支援“編輯并繼續”的特定情況,因為這些情況取決于程式設計語言、程式堆棧的目前狀态以及調試器能否在不 損壞程序的情況下更改狀态。确定是否支援編輯更改的最佳方法就是嘗試進行該更改;在調試器中可立即知道是否支援該更改。

示例 4

在此示例中,将調試器運作到某個異常,後退異常,更正該方法的邏輯,然後更改某個變量的值,以使您可繼續執行該方法。

在 MainPage 構造函數中調用 Example4 方法。編輯 MainPage() 構造函數,将 methodTrack = String.Empty; 之後的一行替換為行 Example4();。

運作到該異常。通過在“調試”菜單上選擇“啟動調試”(鍵盤:F5),啟動調試會話。再次按 F5 以繼續執行。調試器在 Example4 方法中的異常處暫停執行,并顯示一個異常對話框。

更改程式邏輯。很明顯,錯誤發生在 if 條件中:當 x 等于 0 時應更改 x 的值;但 x 不等于零時不應更改該值。選擇“中斷”修複該方法的邏輯。當嘗試編輯該行時,将顯示另一個對話框。

選擇“編輯”,然後将行 if (x != 0) 更改為 if (x == 0)。調試器将程式邏輯的更改保留到源檔案。