教學課程:瞭解如何使用 Visual Studio 對 C# 程式代碼進行偵錯
本文逐步解說 Visual Studio 偵錯工具的功能。 如果您要更上層的除錯程式功能檢視,請參閱 第一次查看除錯程式。 當您 偵錯您的應用程式時,這通常表示您正在執行附加調試器的應用程式。 當您執行這項工作時,調試程式會提供許多方式來查看程式代碼在執行時所執行的動作。 您可以逐步執行程式碼並檢視儲存在變數中的值、設定變數的監看式以查看值何時變更、您可以檢查程式碼的執行路徑、查看程式碼的分支是否正在執行等等。 如果此練習是您第一次嘗試偵錯,建議您先閱讀 絕對初學者的偵錯指南,再閱讀本文。
雖然示範應用程式是 C#,但大部分功能都適用於 Visual Studio 所支援C++、Visual Basic、F#、Python、JavaScript 和其他語言(F# 不支援編輯後繼續。F# 和 JavaScript 不支援 [自動] 視窗)。 螢幕快照位於 C# 中。
在本教學課程中,您將:
- 啟動調試程式並叫用斷點。
- 了解在調試程式中逐步執行程式碼的命令
- 檢查數據提示和調試程序視窗中的變數
- 檢查呼叫堆疊
先決條件
您必須安裝 Visual Studio 2022,並具備 .NET 桌面開發 的工作負載。
您必須安裝 Visual Studio 2019 並擁有 的 .NET Core 跨平台開發 工作負載。
如果您尚未安裝 Visual Studio,請移至 Visual Studio 下載 頁面免費安裝。
如果您需要安裝工作負載,但已經有 Visual Studio,請移至 Tools>Get Tools and Features...,這會開啟 Visual Studio 安裝程式。 Visual Studio 安裝程式隨即啟動。 選擇 .NET Core 跨平台開發 工作負載,然後選擇 修改。
如果您已經有 Visual Studio,但尚未安裝 .NET 桌面開發 工作負載,請移至 Tools>Get Tools and Features...,以啟動 Visual Studio 安裝程式。 在 Visual Studio 安裝程式中,選擇 .NET 桌面開發 工作負載,然後選擇 修改。
建立專案
首先,您會建立 .NET Core 控制台應用程式專案。 項目類型附帶您需要的所有範本檔案,甚至在您新增任何內容之前就已經提供!
開啟 Visual Studio。 如果啟動視窗未開啟,請選擇 [[檔案]>[開始視窗]。
在 [開始] 視窗中,選取 [[建立新專案]。
在 [[建立新專案] 視窗中,於搜尋方塊中輸入 控制台。 接下來,從 [語言] 列表中選擇 [C#],然後選擇 [平臺] 清單中的 [Windows]。
套用語言和平台篩選器之後,請選擇 .NET Core 的 控制台應用程式 範本,然後選取 [下一步] 。
注意
如果您沒有看到 主控台應用程式 樣本,您可以從 [建立新的 專案] 視窗 安裝它。 在 找不到您要的內容嗎? 訊息中,選擇 安裝更多工具和功能 連結。 然後,在 Visual Studio 安裝程式中,選擇 .NET Core 跨平台開發 工作負載。
在 [設定新專案] 視窗中,於 [項目名稱] 方塊中輸入 getStartedDebugging。 然後,選取 下一步。
選取建議的目標框架(.NET 8.0 或長期支援),然後選取【建立】。
在 [[建立新專案] 視窗中,於搜尋方塊中輸入 控制台。 接下來,從 [語言] 列表中選擇 [C#],然後選擇 [平臺] 清單中的 [Windows]。
套用語言和平台篩選之後,選擇 [主控台應用程式] 樣本,然後選取 [下一步] 。
注意
如果您沒有看到 主控台應用程式 樣本,您可以從 [建立新的 專案] 視窗 安裝它。 在您是否找不到所需項目? 訊息中,請選擇安裝更多工具和功能 的連結。 然後,在 Visual Studio 安裝程式中,選擇 .NET 桌面開發 工作負載。
在 [設定新專案] 視窗中,於 [項目名稱] 方塊中輸入 getStartedDebugging。 然後,選取 [下一步]。
在 [其他資訊] 視窗中,確定已選取 [Framework] 下拉功能表中的 [.NET 8.0],然後選取 [建立 ]。
Visual Studio 會開啟您的新專案。
建立應用程式
在 Program.cs中,以下列程式代碼取代所有預設程式代碼:
using System;
class ArrayExample
{
static void Main()
{
char[] letters = { 'f', 'r', 'e', 'd', ' ', 's', 'm', 'i', 't', 'h'};
string name = "";
int[] a = new int[10];
for (int i = 0; i < letters.Length; i++)
{
name += letters[i];
a[i] = i + 1;
SendMessage(name, a[i]);
}
Console.ReadKey();
}
static void SendMessage(string name, int msg)
{
Console.WriteLine("Hello, " + name + "! Count to " + msg);
}
}
啟動調試程式!
按下 F5(偵錯 > 開始偵錯)或 開始偵錯 按鈕 ,即可啟動偵錯。。
F5 使用附加至應用程式進程的調試程式啟動應用程式,但現在我們沒有執行任何特殊動作來檢查程式代碼。 因此,應用程式載入後,您會看到這個控制台輸出。
Hello, f! Count to 1 Hello, fr! Count to 2 Hello, fre! Count to 3 Hello, fred! Count to 4 Hello, fred ! Count to 5 Hello, fred s! Count to 6 Hello, fred sm! Count to 7 Hello, fred smi! Count to 8 Hello, fred smit! Count to 9 Hello, fred smith! Count to 10
在本教學課程中,您會使用調試程序進一步瞭解此應用程式,並查看調試程式功能。
按下紅色停止按鈕來停止調試程式(Shift + F5)。
在主控台視窗中,按下按鍵以關閉主控台視窗。
大部分情況下,我們在這裡使用鍵盤快捷方式,因為它是執行調試程式命令的快速方式。 例如工具列或功能表命令等的相應命令也會被標註。
若要啟動調試程式,請選取 [F5],或在標準工具列中選擇 [偵錯目標] 按鈕,或在偵錯工具列中選擇 [開始偵錯] 按鈕,或從功能表列中選擇 [偵錯>開始偵錯]。
F5 啟動應用程式,並將調試器附加到應用程式進程。 由於我們沒有執行任何特殊動作來檢查程序代碼,因此應用程式會執行以完成,您會看到主控台輸出。
Hello, f! Count to 1 Hello, fr! Count to 2 Hello, fre! Count to 3 Hello, fred! Count to 4 Hello, fred ! Count to 5 Hello, fred s! Count to 6 Hello, fred sm! Count to 7 Hello, fred smi! Count to 8 Hello, fred smit! Count to 9 Hello, fred smith! Count to 10
若要停止偵錯,請按 Shift+F5,或選擇偵錯工具列的 [停止偵錯] 按鈕,或從功能表列選擇 [偵錯] -> [>停止偵錯]。
在控制台視窗中,選取任意鍵以關閉控制台視窗。
設定斷點並啟動調試程式
在
Main
函式的for
迴圈中,在下列程式碼行的左側邊界點擊來設定斷點:name += letters[i];
紅色圓圈 會出現您設定斷點的位置。
斷點是可靠偵錯的最基本和基本功能之一。 斷點指出 Visual Studio 應該在何處暫停執行中的代碼,以便檢視變數的值、記憶體的運作情形,或是確認代碼的分支是否正在被執行。
按 F5 或 [開始偵錯] 按鈕。 應用程式啟動,而調試程式會執行至您設定斷點的程式代碼行。
黃色箭號代表調試程序暫停的語句,其也會在相同時間點暫停應用程式執行(此語句尚未執行)。
如果應用程式尚未執行,F5 啟動調試程式,並在第一個斷點停止。 否則,F5 會繼續執行應用程式到下一個斷點。
當您知道要詳細檢查的程式碼行或區段時,斷點是一個實用的功能。 如需了解您可以設定的不同斷點類型的資訊,例如條件式斷點,請參閱 使用斷點。
在
Main
函式的for
迴圈中,請在以下程式碼行的左側邊欄中按一下以設置斷點:name += letters[i];
紅色圓圈隨即出現,您可以在其中設定斷點。
斷點是可靠偵錯的重要功能。 您可以設定斷點,讓 Visual Studio 暫停執行中的程式代碼,以便查看變數的值或記憶體的行為,或知道程式代碼的分支是否正在執行。
若要開始偵錯,請選取 [F5],或選擇 [標準] 工具列中的 [偵錯目標] 按鈕,或從功能表欄 選擇 [偵錯]>[開始偵錯]] 按鈕。 應用程式會啟動,偵錯工具會執行至您設定斷點的代碼行。
黃色箭號指向偵錯器暫停的語句。 應用程式執行會在相同的時間點暫停,語句尚未執行。
當應用程式未執行時,F5 啟動調試程式,它會執行應用程式直到到達第一個斷點為止。 如果應用程式在斷點暫停,則 F5 會繼續執行應用程式,直到到達下一個斷點為止。
當您知道需要詳細檢查的程式碼行或區段時,斷點是一個非常實用的功能。 如需瞭解更多您可以設定的不同斷點類型,例如條件式斷點,請參閱使用斷點 。
使用數據提示瀏覽程式代碼並檢查數據
大部分情況下,我們在這裡使用鍵盤快捷方式,因為它是在調試程式中快速執行應用程式的好方法(例如功能表命令等對等命令會顯示在括弧中)。
當程式代碼執行暫停於
name += letters[i]
語句時,請將滑鼠停留在letters
變數上,而您會看到其預設值,即數組中的第一個專案值,char[10]
。可讓您檢查變數的功能是調試程式最有用的功能之一,而且有不同的方式可以執行。 通常,當您嘗試對問題進行偵錯時,您會嘗試找出變數是否儲存您預期在特定時間擁有的值。
展開
letters
變數以查看其屬性,其中包含變數所包含的所有元素。接下來,將滑鼠停留在
name
變數上,您會看到其目前值空字串。按 F10 (或選擇 偵錯 > 跨)兩次,以前進到
SendMessage
方法呼叫,然後再按 F10 一次。F10 會將偵錯工具前進到下一個程式碼敘述,而不會進入應用程式的函式或方法(程式碼仍會執行)。 藉由在
SendMessage
方法呼叫上按 F10,我們略過了SendMessage
的實作程式代碼(也許我們現在不感興趣)。按 F10(或 偵錯>逐步執行),多次逐一查看
for
迴圈、在斷點再次暫停,並在每次檢查其值時停留在name
變數上。變數的值會隨著
for
迴圈的每個反覆運算而變更,其中顯示f
的值、fr
、fre
等等。 若要在此案例中更快速地使調試器穿過迴圈,您可以按 F5(或選擇 [偵錯]>[繼續]),這會讓您前進到斷點,而不是下一個語句。通常,在偵錯時,您想要快速檢查變數上的屬性值,以查看它們是否儲存預期要儲存的值,而數據提示是執行此動作的好方法。
當程式代碼執行在
Main
方法的for
循環中維持暫停時,請按 F11(或選擇 [偵錯 > 逐步執行],直到您在SendMessage
方法呼叫暫停為止。您應該在此一行程式代碼中:
SendMessage(name, a[i]);
再按 F11 一次,以進入
SendMessage
模式。黃色指標會前進到
SendMessage
方法。F11 是 逐步進入 命令,讓應用程式逐句執行。 F11 是最詳細地檢查執行流程的好方法。 根據預設,調試程式會略過非用戶程式代碼(如果您想要更多詳細數據,請參閱 Just My Code)。
假設您已完成檢查
SendMessage
方法,但您想退出該方法,仍然留在除錯器中。 您可以使用 Step Out 命令來執行此動作。按 Shift + F11 (或 除錯 > 跳出)。
此命令會繼續執行應用程式(並推進調試進程),直到目前的方法或函數返回為止。
您應該回到
for
迴圈,在Main
方法中,在SendMessage
方法呼叫處暫停。 如需瞭解更多在程式碼中移動的不同方法,請參閱 在調試器中導航代碼。
當程式代碼執行暫停於
name += letters[i]
語句時,將滑鼠懸停於letters
變數上,以查看顯示陣列大小和元素類型的資料提示,char[10]
。注意
調試程式最有用的功能之一是其檢查變數的能力。 通常,當您嘗試對問題進行偵錯時,您會嘗試找出變數是否有特定時間預期的值。 查看數據提示是檢查數據是否正確的好方法。
展開
letters
變數來查看其所有陣列元素及其值。將滑鼠停留在
name
變數上,以查看其目前值,這是空字串。若要將偵錯器前進到下一個語句,請選取 F10,或者在偵錯工具列中選擇 [逐步執行] 按鈕,或從功能表欄選擇 [偵錯]>[逐步執行]。 選取 F10 兩次以跳過
SendMessage
方法呼叫。F10 會推進調試器而不步入函式或方法,但其程式碼仍然會執行。 如此一來,我們已略過在
SendMessage
方法中對程式代碼進行偵錯,目前我們對此不感興趣。若要重複執行
for
循環幾次,請重複選取 F10。 在每次迴圈執行時,在斷點處暫停,然後將滑鼠停留在name
變數上,以檢查資料提示中的值。變數的值會隨著
for
迴圈的每個反覆運算而變更,其中顯示f
的值、fr
、fre
等等。 若要加快偵錯器通過迴圈的速度,請改選 F5,這會直接跳至斷點,而不是執行下一行語句。當程式代碼執行暫停於
for
迴圈中的Main
方法時,請選取 [F11],或從 [偵錯] 工具列選擇 [逐步執行] 按鈕,或從功能表欄選擇 [偵錯>逐步執行],直到您到達SendMessage
方法呼叫為止。除錯程式應該在這行程式碼暫停:
SendMessage(name, a[i]);
若要進入
SendMessage
方法,請再次選取 F11。黃色指標會前進到
SendMessage
方法。F11 可協助您更深入地檢查程式代碼的執行流程。 若要從方法呼叫中逐步進入方法,請選取 F11。 根據預設,調試程式會略過逐步執行非使用者方法。 若要瞭解如何偵錯非使用者程式代碼,請參閱 Just My Code。
完成
SendMessage
方法偵錯之後,您就可以回到main
方法的for
迴圈。若要離開
SendMessage
方法,請選取 [Shift+F11],或在 [偵錯] 工具欄中選擇 [[跳出] 按鈕,或從功能表欄選擇 [偵錯]>[跳出]。跳出 恢復應用程式的執行,並推進調試器直到當前的方法或函式返回為止。
您看到黃色指標回到了
Main
方法的for
迴圈中,並暫停在SendMessage
方法呼叫時。 如需有關以不同方式瀏覽程式碼的詳細資訊,請參閱 在除錯程式中瀏覽程式碼。
使用「運行至點擊」功能瀏覽程式碼
選取 [F5],以再次前進到斷點。
在程式代碼編輯器中,向下捲動,並將滑鼠停留在
SendMessage
方法的Console.WriteLine
方法上,直到綠色 [執行至按鍵」 按鈕 隨即出現。 按鈕的工具提示會顯示「執行操作至此」。注意
Visual Studio 2017 中的 [運行至點擊] 按鈕是全新的。 (如果您沒有看到綠色箭號按鈕,請改用本範例中的 F11,將調試程序前進到正確的位置。
選取 [執行] 按兩下 [] 按鈕。
除錯器進入
Console.WriteLine
方法。使用此按鈕類似於設定暫時斷點。 [執行至按兩下] 可讓您快速在應用程式程式代碼的可見區域內四處走動(您可以在任何開啟的檔案中選取)。
選取 [F5],以再次前進到斷點。
在程式代碼編輯器中,將滑鼠停留在
SendMessage
方法中的Console.WriteLine
方法呼叫,直到 [運行至點擊] 按鈕出現為止。 按鈕的工具提示會顯示「執行至這裡」。選擇 [執行] 按兩下 [] 按鈕。 或者,將游標放在
Console.WriteLine
語句上,按下 Ctrl+F10 。 或者,以滑鼠右鍵點擊Console.WriteLine
方法呼叫,然後從操作功能表選擇 執行至游標。除錯器會前進到
Console.WriteLine
方法呼叫。使用 [執行至按兩下] 按鈕類似於設定暫時斷點,並方便在開啟檔案中快速瀏覽應用程式程式碼的可見區域內。
快速重新啟動您的應用程式
選取 [重新啟動 ] 按鈕 [重新啟動] 按鈕 (Ctrl + Shift + F5)。
當您按下 [重新啟動時,它可節省時間,而不是停止應用程式並重新啟動調試程式。 偵錯器會在程式碼執行到的第一個斷點暫停。
偵錯器會再次在您先前在 for
循環內設定的斷點停止。
若要從調試程式一開始重新執行您的應用程式,請從調試程式選取 [Ctrl+Shift+F5],或從功能表欄選擇 [重新啟動] 按鈕,或從功能表欄選擇 [偵錯]>[重新啟動]。
重新啟動 會停止調試程式,然後在一個步驟中重新啟動。 當調試程式重新啟動時,它會執行至第一個斷點,這是您先前在 for
迴圈內設定的斷點,然後暫停。
使用 [自動變數] 和 [局部變數] 視窗檢查變數
查看程式代碼編輯器底部的 [自動] 視窗。
如果它已關閉,請在調試器中暫停時開啟,方法是選擇 偵錯>Windows>Autos。
在 [自動變數] 視窗中,您會看到變數及其目前的值。 [Autos] 視窗會顯示目前行或上一行使用的所有變數(請檢查語言特定行為的文件)。
接下來,在 [自動] 視窗旁的標籤中,查看 [局部] 視窗。
展開
letters
變數以顯示它所包含的元素。[局部變數] 視窗會顯示目前 範圍中的變數,也就是目前的執行內容。
自動變數 和 局部變數 視窗在偵錯時顯示變數值。 視窗只能在偵錯會話期間使用。 [自動變數] 視窗會顯示調試程式目前行及前一行所使用的變數。 [局部變數] 視窗顯示在局部作用域中定義的變數,通常是當前函數或方法的範圍。
暫停除錯程式時,查看程式碼編輯器底部的 [Autos] 視窗。
如果 [Autos] 視窗被關閉,請從功能表列選擇 [Ctrl+D]、[],或從功能表列選擇 [偵錯>Windows>Autos]。
當偵錯工具仍然暫停時,請在 [局部] 視窗,檢視位於 [自動] 視窗旁的標籤。
如果 [局部變數] 視窗已關閉,請選擇 [Ctrl+D]、[L],或選擇 [偵錯>] [Windows>] [局部變數]。
在 [局部變數] 視窗中,展開
letters
變數以查看其陣列元素及其值。
如需 自動變數 和 局部變數 視窗的詳細資訊,請參閱 在 [自動變數] 和 [局部變數] 視窗中檢查變數。
設定監看式
在主要程式代碼編輯器視窗中,以滑鼠右鍵點擊 name
變數,然後選擇 新增監看式。
[監視] 視窗會在程式代碼編輯器底部開啟。 您可以使用 Watch 視窗來指定您想要留意的變數(或表達式)。
現在,您已在 name
變數上設定監看式,而且當您在調試程式中移動時,可以看到其值變更。 不同於其他變數視窗,監看式 視窗一律會顯示您正在監看的變數(範圍不足時會呈現灰色)。
您可以指定要在調試程式碼時監看的變數或表達式,並將其新增至 監看 視窗。
在調試器暫停時,在
name
變數上點擊滑鼠右鍵,並選擇 新增監看式。監看式 視窗預設會在程式碼編輯器底部開啟。
當您在
name
變數上設定了監看式後,請逐步執行您的程式代碼,以觀察每次for
迴圈執行時name
變數的值如何變化。不同於其他變數視窗,監看 視窗一律會顯示您正在監看的變數。 範圍不足的變數會顯示為無法使用。
如需 Watch 視窗的詳細資訊,請參閱 Watch 變數與監看式視窗。
檢查呼叫堆疊
當程式代碼執行暫停於
for
循環時,請選取 呼叫堆疊 視窗,預設會在右下方窗格中開啟。如果關閉,請在除錯程式中暫停時開啟它,方法是選擇 [偵錯]>Windows>呼叫堆疊。
選取 F11 多次,直到您在
SendMessage
方法中看到偵錯器暫停為止。 查看 [呼叫堆疊] 視窗。呼叫堆疊 視窗會顯示呼叫方法和函式的順序。 頂端線會顯示目前的函式(此應用程式中的
SendMessage
方法)。 第二行顯示SendMessage
是從Main
方法呼叫的,依此類推。注意
呼叫堆疊 視窗類似於一些 IDE(如 Eclipse)中的偵錯介面。
呼叫堆疊是檢查及瞭解應用程式執行流程的好方法。
您可以按兩下一行程式代碼來查看該原始程式碼,這也會變更調試程式正在檢查中的目前範圍。 此動作不會讓調試程序前進。
您也可以使用 呼叫堆疊 視窗中的右鍵選單來做其他事情。 例如,您可以將斷點插入指定的函式、使用 Run 至 Cursor將調試程式往前推進,然後檢查原始程式碼。 如需詳細資訊,請參閱 如何:檢查呼叫堆疊。
呼叫 Stack 可藉由顯示呼叫方法和函式的順序,協助您瞭解應用程式的執行流程。
在
for
循環中暫停調試程式時,請檢視 呼叫堆疊 視窗,此視窗預設會在程式碼編輯器的右下方窗格中開啟。如果「呼叫堆疊」視窗已關閉,請按 Ctrl+D、C,或從功能表欄中選擇 偵錯>Windows>呼叫堆疊。
在 [呼叫堆疊] 視窗中,您會看到指向目前
Main
方法的黃色指標。按下 F11 幾次,直到您在
SendMessage
方法中看到偵錯器暫停為止。呼叫堆疊 視窗的頂端行會顯示目前函式,即
SendMessage
方法。 第二行顯示SendMessage
方法是從Main
方法中呼叫的。注意
呼叫堆疊 視窗類似於某些 IDE 中的 [除錯] 視角,例如 Eclipse。
在 [呼叫堆疊] 視窗中,您可以雙擊一行程式代碼以移至該源代碼,這會變更調試程式檢視中的目前範圍。 此動作不會讓調試程序前進。
您也可以使用 呼叫堆疊 視窗中的右鍵選單來做其他事。 例如,您可以將斷點插入指定的函式、使用 Run 至 Cursor,或移至原始程式碼來推進調試程式。
如需 呼叫堆疊的詳細資訊,請參閱 如何:檢查呼叫堆疊。
後續步驟
在本教學課程中,您已瞭解如何啟動調試程式、逐步執行程序代碼,以及檢查變數。 您可能會想要深入瞭解調試程式功能,以及詳細信息的連結。