本文逐步解說 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,或選擇偵錯工具列的 [停止偵錯] 按鈕,或從功能表列選擇 [偵錯] -> [>停止偵錯]。
在控制台視窗中,選取任意鍵以關閉控制台視窗。
設定斷點並啟動調試程式
在
for函式的Main迴圈中,在下列程式碼行的左側邊界點擊來設定斷點:name += letters[i];紅色圓圈
會出現您設定斷點的位置。斷點是可靠偵錯的最基本和基本功能之一。 斷點指出 Visual Studio 應該在何處暫停執行中的代碼,以便檢視變數的值、記憶體的運作情形,或是確認代碼的分支是否正在被執行。
按 F5 或 [開始偵錯] 按鈕。
應用程式啟動,而調試程式會執行至您設定斷點的程式代碼行。
黃色箭號代表調試程序暫停的語句,其也會在相同時間點暫停應用程式執行(此語句尚未執行)。
如果應用程式尚未執行,F5 啟動調試程式,並在第一個斷點停止。 否則,F5 會繼續執行應用程式到下一個斷點。
當您知道要詳細檢查的程式碼行或區段時,斷點是一個實用的功能。 如需了解您可以設定的不同斷點類型的資訊,例如條件式斷點,請參閱 使用斷點。
在
for函式的Main迴圈中,在下列程式碼行的左側邊界點擊來設定斷點: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(或選擇 [偵錯]>[繼續]),這會讓您前進到斷點,而不是下一個語句。通常,在偵錯時,您想要快速檢查變數上的屬性值,以查看它們是否儲存預期要儲存的值,而數據提示是執行此動作的好方法。
當程式代碼執行在
for方法的Main循環中維持暫停時,請按 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方法偵錯之後,您就可以回到for方法的main迴圈。若要離開
SendMessage方法,請選取 [Shift+F11],或在 [偵錯] 工具欄中選擇 [[跳出] 按鈕,或從功能表欄選擇 [偵錯]>[跳出]。跳出 恢復應用程式的執行,並推進調試器直到當前的方法或函式返回為止。
您看到黃色指標回到了
for方法的Main迴圈中,並暫停在SendMessage方法呼叫時。 如需瞭解更多在程式碼中移動的不同方法,請參閱 在調試器中導航代碼。
使用「運行至點擊」功能瀏覽程式碼
選取 [F5],以再次前進到斷點。
在程式代碼編輯器中,向下捲動,並將滑鼠停留在
Console.WriteLine方法的SendMessage方法上,直到綠色 [執行至按鍵」 按鈕
隨即出現。 按鈕的工具提示會顯示「執行操作至此」。
注意
Visual Studio 2017 中的 [運行至點擊] 按鈕是全新的。 (如果您沒有看到綠色箭號按鈕,請改用本範例中的 F11,將調試程序前進到正確的位置。
選取 [執行] 按兩下 [] 按鈕。
除錯器進入
Console.WriteLine方法。使用此按鈕類似於設定暫時斷點。 [執行至按兩下] 可讓您快速在應用程式程式代碼的可見區域內四處走動(您可以在任何開啟的檔案中選取)。
選取 [F5],以再次前進到斷點。
在程式代碼編輯器中,將滑鼠停留在
Console.WriteLine方法中的SendMessage方法呼叫,直到 [運行至點擊] 按鈕出現為止。 按鈕的工具提示會顯示「執行操作至此」。
選擇 [執行] 按兩下 [] 按鈕。 或者,將游標放在
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變數上設定了監看式後,請逐步執行您的程式代碼,以觀察每次name迴圈執行時for變數的值如何變化。不同於其他變數視窗,監看 視窗一律會顯示您正在監看的變數。 範圍不足的變數會顯示為無法使用。
如需 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,或移至原始程式碼來推進調試程式。
如需 呼叫堆疊的詳細資訊,請參閱 如何:檢查呼叫堆疊。
後續步驟
在本教學課程中,您已瞭解如何啟動調試程式、逐步執行程序代碼,以及檢查變數。 您可能會想要深入瞭解調試程式功能,以及詳細信息的連結。