教學課程:了解如何使用 Visual Studio 對 Visual Basic 程式碼進行偵錯
本文以逐步解說介紹 Visual Studio 偵錯工具的功能。 如果您希望檢視偵錯工具功能的概要,請參閱偵錯工具簡介。 當您偵錯您的應用程式,通常表示您正在執行附加偵錯工具的應用程式。 執行此工作時,偵錯工具會提供許多方式來查看您程式碼所執行的功能。 您可以逐步執行程式碼並查看儲存在變數中的值、可以設定變數的監看式以查看值變更、可以檢查程式碼的執行路徑,查看是否正在執行程式碼的分支,依此類推。 如果此練習是您第一次嘗試偵錯程式碼,您可能想要先閱讀適合完全初學者的偵錯,再瀏覽本文。
雖然示範應用程式是 Visual Basic,但大部分功能都適用於 C#、C++、F#、Python、JavaScript,以及 Visual Studio 所支援其他語言(F# 不支援「編輯後繼續」。F# 和 JavaScript 不支援 [自動變數] 視窗)。 螢幕擷取畫面位於 Visual Basic 中。
在此教學課程中,您需要:
- 啟動偵錯工具,並叫用中斷點。
- 了解命令以在偵錯工具中逐步執行程式碼
- 檢查資料提示和偵錯工具視窗中的變數
- 檢查呼叫堆疊
必要條件
您必須安裝 Visual Studio 2019 和 .NET Core 跨平台開發工作負載。
如果您尚未安裝 Visual Studio,請前往 Visual Studio 下載頁面免費進行安裝。
如果您需要安裝工作負載,但已安裝 Visual Studio,請移至 [工具]>[取得工具與功能...],以開啟 Visual Studio 安裝程式。 Visual Studio 安裝程式即會啟動。 選擇 [.NET Core 跨平台開發] 工作負載,然後選擇 [修改]。
如果您尚未安裝 Visual Studio,請前往 Visual Studio 下載頁面免費進行安裝。
如果您需要安裝工作負載,但已安裝 Visual Studio,請移至 [工具]>[取得工具與功能...],以開啟 Visual Studio 安裝程式。 Visual Studio 安裝程式即會啟動。 選擇 [.NET 桌面開發] 工作負載,然後選擇 [修改]。
建立專案
首先,您會建立 .NET Core 主控台應用程式專案。 此專案類型隨附您需要的所有範本檔案,甚至是在您新增任何項目之前便已完備!
開啟 Visual Studio。 如果開始視窗未開啟,請選取 [檔案] > [開始視窗]。
在 [開始] 視窗上,選取 [建立新專案]。
在 [建立新專案] 視窗的搜尋方塊中輸入 console。 接下來,從語言清單中選擇 Visual Basic,然後從平台清單中選擇 Windows。
在您套用語言和平台的篩選條件之後,請選擇 .NET Core 的 [主控台應用程式] 範本,然後選取 [下一步]。
注意
如果您未看到 [主控台應用程式] 範本,您可以從 [建立新專案] 視窗中安裝。 在 [找不到你要尋找的項目嗎?] 訊息中,選擇 [安裝更多工具和功能] 連結。 接下來,在 Visual Studio 安裝程式中選擇 .NET Core 跨平台開發工作負載。
在 [設定您的新專案] 視窗的 [專案名稱] 方塊中,輸入 get-started-debugging。 然後選取下一步。
選取建議的目標架構 (.NET 8.0 或長期支援),然後選取 [建立]。
在 [建立新專案] 視窗的搜尋方塊中輸入 console。 接下來,從語言清單中選擇 Visual Basic,然後從平台清單中選擇 Windows。
在您套用語言和平台的篩選條件之後,請選擇 .NET Core 的 [主控台應用程式] 範本,然後選取 [下一步]。
注意
如果您未看到 [主控台應用程式] 範本,您可以從 [建立新專案] 視窗中安裝。 在 [找不到你要尋找的項目嗎?] 訊息中,選擇 [安裝更多工具和功能] 連結。 然後,在 Visual Studio 安裝程式中選擇 [.NET 桌面開發] 工作負載。
在 [設定您的新專案] 視窗的 [專案名稱] 方塊中,輸入 get-started-debugging。 然後選取下一步。
在 [其他資訊] 視窗中,確認已在 [架構] 下拉式功能表中選取 [.NET 8.0],然後選取 [建立]。
Visual Studio 會隨即開啟您的新專案。
建立應用程式
在 Program.vb中,請改用下列程式碼取代所有預設程式碼:
Imports System
Class ArrayExample
Public Shared Sub Main()
Dim letters As Char() = {"f"c, "r"c, "e"c, "d"c, " "c, "s"c, "m"c, "i"c, "t"c, "h"c}
Dim name As String = ""
Dim a As Integer() = New Integer(9) {}
For i As Integer = 0 To letters.Length - 1
name += letters(i)
a(i) = i + 1
SendMessage(name, a(i))
Next
Console.ReadKey()
End Sub
Private Shared Sub SendMessage(ByVal name As String, ByVal msg As Integer)
Console.WriteLine("Hello, " & name & "! Count to " & msg)
End Sub
End Class
啟動偵錯工具!
按 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 鍵會繼續執行應用程式到下一個中斷點。
如果您知道要詳細檢查的程式碼行或程式碼區段,則中斷點是一個很有用的功能。 如需您可以設定之不同中斷點類型的資訊,例如條件中斷點,請參閱使用中斷點。
使用逐步執行命令在偵錯工具中巡覽程式碼
在大部分情況下,我們會在這裡使用鍵盤快速鍵,因為這是在偵錯工具中快速執行應用程式的好方法 (功能表命令等對等命令會顯示在括弧內)。
程式碼執行在
Main
方法的For
迴圈中暫停時,請按 F11 (或選擇 [偵錯] > [逐步執行]) 兩次,以前進到SendMessage
方法呼叫。按下 F11 兩次之後,您應該會在這一行程式碼中:
SendMessage(name, a(i))
再按 F11 一次,以逐步執行
SendMessage
方法。黃色指標會前進至
SendMessage
方法。F11 鍵是逐步執行命令,可將應用程式執行一次往前推進一個陳述式。 F11 鍵是以最詳細的方式檢查執行流程的好方法。 (若要更快速地在程式碼中移動,我們也會示範一些其他選項。)根據預設,偵錯工具會略過非使用者程式碼 (如果您想要更多的詳細資料,請參閱 Just My Code)。
假設您已完成檢查
SendMessage
方法,而您想要退出方法,但會留在偵錯工具中。 您可以使用 [跳離函式] 命令完成這項動作。按下 Shift + F11 (或 [偵錯] [跳離函式]>)。
此命令會繼續應用程式執行 (並推進偵錯工具),直到目前的方法或函式傳回為止。
您應該回到
Main
方法中的For
迴圈,在SendMessage
方法呼叫時暫停。按 F11 數次,直到您再次回到
SendMessage
方法呼叫為止。程式碼執行在方法呼叫暫停時,按下 F10 (或選擇 [偵錯] > [逐步執行]) 一次。
請注意,此時偵錯工具不會逐步執行
SendMessage
方法。 F10 鍵會推進偵錯工具,而不需要逐步執行應用程式程式碼中的函式或方法 (此程式碼仍會執行)。 藉由在SendMessage
方法呼叫上按 F10 鍵 (而非 F11 鍵),我們略過了SendMessage
的實作程式碼 (現在對我們不太重要)。 如需不同方式在程式碼中移動的詳細資訊,請參閱在偵錯工具中巡覽程式碼。
在本文中,我們使用鍵盤快速鍵,因為這是在偵錯工具中快速執行應用程式的好方法 (功能表命令等對等命令會顯示在括弧內)。
程式碼執行在
Main
方法的For
迴圈中暫停時,請按 F11 (或選擇 [偵錯] > [逐步執行]) 兩次,以前進到SendMessage
方法呼叫。按下 F11 兩次之後,您應該會在這一行程式碼中:
SendMessage(name, a(i))
再按 F11 一次,以逐步執行
SendMessage
方法。黃色指標會前進至
SendMessage
方法。F11 鍵是逐步執行命令,可將應用程式執行一次往前推進一個陳述式。 F11 鍵是以最詳細的方式檢查執行流程的好方法。 (若要更快速地在程式碼中移動,我們也會示範一些其他選項。)根據預設,偵錯工具會略過非使用者程式碼 (如果您想要更多的詳細資料,請參閱 Just My Code)。
假設您已完成檢查
SendMessage
方法,而您想要退出方法,但會留在偵錯工具中。 您可以使用 [跳離函式] 命令完成這項動作。按下 Shift + F11 (或 [偵錯] [跳離函式]>)。
此命令會繼續應用程式執行 (並推進偵錯工具),直到目前的方法或函式傳回為止。
您應該回到
Main
方法中的For
迴圈,在SendMessage
方法呼叫時暫停。按 F11 數次,直到您再次回到
SendMessage
方法呼叫為止。程式碼執行在方法呼叫暫停時,按下 F10 (或選擇 [偵錯] > [逐步執行]) 一次。
請注意,此時偵錯工具不會逐步執行
SendMessage
方法。 F10 鍵會推進偵錯工具,而不需要逐步執行應用程式程式碼中的函式或方法 (此程式碼仍會執行)。 藉由在SendMessage
方法呼叫上按 F10 鍵 (而非 F11 鍵),我們略過了SendMessage
的實作程式碼 (現在對我們不太重要)。 如需不同方式在程式碼中移動的詳細資訊,請參閱在偵錯工具中巡覽程式碼。
使用 [執行至點選處] 來巡覽程式碼
按下 F5,再次前進到中斷點。
在程式碼編輯器中,向下捲動並將滑鼠停留在
SendMessage
方法的Console.WriteLine
方法上方,直到綠色 [執行至點選處] 按鈕出現為止。 按鈕的工具提示會顯示「執行到這裡」。注意
[執行至點選處] 按鈕是 Visual Studio 2017 的新功能。 (如果您沒有看到綠色箭號按鈕,請在此範例中改用 F11,將偵錯工具推進到正確的位置。)
選取 [執行至點選處] 按鈕。
偵錯工具會前進到
Console.WriteLine
方法。使用此按鈕類似於設定暫時中斷點。 [執行至點選處] 方便您在應用程式程式碼的可見區域內快速瀏覽 (您可以選取任何開啟的檔案)。
按下 F5,再次前進到中斷點。
在程式碼編輯器中,向下捲動並將滑鼠停留在
SendMessage
方法的Console.WriteLine
方法上方,直到綠色 [執行至點選處] 按鈕出現為止。 按鈕的工具提示會顯示「執行到這裡」。選取 [執行至點選處] 按鈕。
偵錯工具會前進到
Console.WriteLine
方法。使用此按鈕類似於設定暫時中斷點。 [執行至點選處] 方便您在應用程式程式碼的可見區域內快速瀏覽 (您可以選取任何開啟的檔案)。
快速重新啟動您的應用程式
選取 [偵錯工具列] 中的 [重新啟動] 按鈕 (Ctrl + Shift + F5)。
相對於停止應用程式並重新啟動偵錯工具,按下 [重新啟動] 可讓您節省時間。 偵錯工具會在執行程式碼叫用的第一個中斷點處暫停。
偵錯工具會在您先前在 For
迴圈內設定的中斷點再次停止。
若要重新啟動您的應用程式,請按 Ctrl + Shift + F5 按鍵組合,可節省時間,而不是停止應用程式並重新啟動偵錯工具。 偵錯工具會在執行程式碼叫用的第一個中斷點處暫停。
偵錯工具會在您先前在 For
迴圈內設定的中斷點再次停止。
使用資料提示來檢查變數
可讓您檢查變數的功能是偵錯工具最實用功能之一,而且有不同的方法來完成此作業。 通常當您嘗試偵錯問題時,您會嘗試確定變數是否會儲存您希望其在特定時間具有的值。
程式碼執行於
name += letters[i]
陳述式暫停時,將滑鼠停留在letters
變數上方,您會看到其預設值,陣列中的第一個元素值,"f"c
。接下來,將滑鼠停留在
name
變數上,您會看到其目前值 (空字串)。按 F5 (或偵錯>繼續),多次逐一查看
For
迴圈、在中斷點再次暫停,並在每次檢查其值時停留在name
變數上。變數的值會隨著
For
迴圈的每個反覆項目而變更,其中顯示f
的值、fr
、fre
等等。很多時候,您會希望在偵錯時快速檢查變數的屬性值,以查看其是否如您預期的儲存值,而資料提示是很適合的方法。
可讓您檢查變數的功能是偵錯工具最實用功能之一,而且有不同的方法來完成此作業。 通常當您嘗試偵錯問題時,您會嘗試確定變數是否會儲存您希望其在特定時間具有的值。
程式碼執行於
name += letters[i]
陳述式暫停時,將滑鼠停留在letters
變數上方,您會看到其預設值,陣列中的第一個元素值,"f"c
。接下來,將滑鼠停留在
name
變數上,您會看到其目前值 (空字串)。按 F5 (或偵錯>繼續),多次逐一查看
For
迴圈、在中斷點再次暫停,並在每次檢查其值時停留在name
變數上。變數的值會隨著
For
迴圈的每個反覆項目而變更,其中顯示f
的值、fr
、fre
等等。很多時候,您會希望在偵錯時快速檢查變數的屬性值,以查看其是否如您預期的儲存值,而資料提示是很適合的方法。
使用 [自動變數] 和 [區域變數] 視窗來檢查變數
查看程式碼編輯器底部的 [自動變數] 視窗。
如果已關閉,請在程式碼執行於偵錯工具中暫停時,選擇 [偵錯] > [視窗] > [自動變數] 將其開啟。
在 [自動變數] 視窗中,您會看到變數及其目前的值。 [自動變數] 視窗會顯示在目前行或前述行 (請查看文件以了解語言特定行為) 中使用的所有變數。
接下來,在 [自動變數] 視窗旁的索引標籤中查看 [區域變數] 視窗。
展開
letters
變數以顯示其所包含的元素。[區域變數] 視窗會顯示位在目前範圍中的變數,即為目前執行內容。
查看程式碼編輯器底部的 [自動變數] 視窗。
如果已關閉,請在程式碼執行於偵錯工具中暫停時,選擇 [偵錯] > [視窗] > [自動變數] 將其開啟。
在 [自動變數] 視窗中,您會看到變數及其目前的值。 [自動變數] 視窗會顯示在目前行或前述行 (請查看文件以了解語言特定行為) 中使用的所有變數。
接下來,在 [自動變數] 視窗旁的索引標籤中查看 [區域變數] 視窗。
展開
letters
變數以顯示其所包含的元素。[區域變數] 視窗會顯示位在目前範圍中的變數,即為目前執行內容。
設定監看式
在主要程式碼編輯器視窗中,以滑鼠右鍵按一下 name
變數,並選擇 [新增監看式]。
[監看式] 視窗隨即在程式碼編輯器底部開啟。 您可以使用 [監看式] 視窗來指定您要留意的變數 (或運算式)。
現在,您已於 name
變數上設定監看式,當您在偵錯工具中移動時,就可以看到其值的變更。 不同於其他變數視窗,[監看式] 視窗一律會顯示所監看的變數 (它們在超出範圍時會呈現灰色)。
您可以指定您要在逐步執行程式碼時監看的變數或運算式,方法是將變數或運算式新增至 [監看式] 視窗。
當偵錯工具暫停時,以滑鼠右鍵按一下
name
變數,然後選擇 [新增監看式]。[監看式] 視窗預設會在程式碼編輯器底部開啟。
既然您已在
name
變數上設定監看式,請逐步執行您的程式碼,查看name
變數的值是否會在每次for
迴圈重複時變更。不同於其他變數視窗,[監看式] 視窗一律會顯示所監看的變數。 範圍以外的變數會顯示為無法使用。
如需 [監看式] 視窗的詳細資訊,請參閱使用監看式視窗監看變數。
檢查呼叫堆疊
當程式碼執行在
For
迴圈中暫停時,選取 [呼叫堆疊] 視窗,此視窗預設會在右下方的窗格中開啟。如果已關閉,請在程式碼執行於偵錯工具中暫停時,選擇 [偵錯] > [視窗] > [呼叫堆疊] 將其開啟。
選取 F11 幾次,直到您在
SendMessage
方法中看到偵錯工具暫停為止。 查看 [呼叫堆疊] 視窗。[呼叫堆疊] 視窗會顯示方法和函式的呼叫順序。 第一行會顯示目前的函式 (此應用程式中的
SendMessage
方法)。 第二行會顯示已從Main
方法呼叫SendMessage
,依此類推。注意
[呼叫堆疊] 視窗類似於某些 IDE (例如 Eclipse) 中的 [偵錯] 檢視方塊。
呼叫堆疊是檢查並了解應用程式執行流程的好方法。
您可以按兩下某一行的程式碼來查看其原始程式碼,這也會變更偵錯工具所檢查的目前範圍。 此動作不會讓偵錯工具往前推進。
您也可以從 [呼叫堆疊] 視窗使用滑鼠右鍵功能表來執行其他動作。 例如,您可以在指定的函式中插入中斷點,使用 [執行至游標處] 讓偵錯工具往前推進,並檢查原始程式碼。 如需詳細資訊,請參閱如何:檢查呼叫堆疊。
當程式碼執行在
For
迴圈中暫停時,選取 [呼叫堆疊] 視窗,此視窗預設會在右下方的窗格中開啟。如果已關閉,請在程式碼執行於偵錯工具中暫停時,選擇 [偵錯] > [視窗] > [呼叫堆疊] 將其開啟。
選取 F11 幾次,直到您在
SendMessage
方法中看到偵錯工具暫停為止。 查看 [呼叫堆疊] 視窗。[呼叫堆疊] 視窗會顯示方法和函式的呼叫順序。 第一行會顯示目前的函式 (此應用程式中的
SendMessage
方法)。 第二行會顯示已從Main
方法呼叫SendMessage
,依此類推。注意
[呼叫堆疊] 視窗類似於某些 IDE (例如 Eclipse) 中的 [偵錯] 檢視方塊。
呼叫堆疊是檢查並了解應用程式執行流程的好方法。
您可以按兩下某一行的程式碼來查看其原始程式碼,這也會變更偵錯工具所檢查的目前範圍。 此動作不會讓偵錯工具往前推進。
您也可以從 [呼叫堆疊] 視窗使用滑鼠右鍵功能表來執行其他動作。 例如,您可以在指定的函式中插入中斷點,使用 [執行至游標處] 讓偵錯工具往前推進,並檢查原始程式碼。 如需詳細資訊,請參閱如何:檢查呼叫堆疊。
變更執行流程
按 F11 兩次以執行
Console.WriteLine
方法。當偵錯工具在
SendMessage
方法呼叫中暫停後,使用滑鼠抓取黃色箭號或執行指標 (位於左邊界),然後將指標上移一行到Console.WriteLine
陳述式。按下 F11。
偵錯工具會重新執行
Console.WriteLine
方法 (您會在主控台視窗輸出中看到此動作)。藉由變更執行流程,您可以執行一些作業,例如測試不同的程式碼執行路徑,或重新執行程式碼而不重新啟動偵錯工具。
警告
您通常需要謹慎使用這項功能,您會在工具提示中看到一則警告。 您可能也會看到其他警告。 移動指標無法將應用程式還原成先前的應用程式狀態。
按 F5 鍵繼續執行應用程式。
恭喜您完成此教學課程!
下一步
在本教學課程中,您已了解如何啟動偵錯工具、逐步執行程式碼,以及檢查變數。 您可能想要進一步查看偵錯工具功能,以及取得詳細資訊的連結。