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