教學課程:使用Visual Studio對C++程式代碼進行偵錯
本文會在逐步解說中介紹Visual Studio調試程式的功能。 當您對應用程式進行偵錯時,通常會使用附加調試程式來執行應用程式。 調試程式提供許多方式來檢查程式代碼在程式執行期間執行的作業。 您可以逐步執行程式碼,查看儲存在變數中的值,並設定監視變數,以便了解值何時變更。 調試程式可協助您檢查程式代碼的執行路徑,並確認程式代碼的分支正在執行。
在本教學課程中,您會:
- 啟動調試程式並在斷點暫停
- 了解命令以在調試器中逐步執行程式碼
- 檢查數據提示和調試程序視窗中的變數
- 檢查呼叫堆疊
如果您不熟悉偵錯,建議您在開始本教學課程之前,先閱讀 給絕對初學者的偵錯指南。 如果您要更上層的除錯程式功能檢視,請參閱 第一次查看除錯程式。
先決條件
已安裝 C++ 工作負載的 Visual Studio 2022
17.12 版或更新版本 桌面開發。 - 若要免費安裝 Visual Studio 2022,請移至 Visual Studio 下載 頁面。
- 若要免費安裝 Visual Studio,請移至 發行和建置歷程記錄 頁面以深入瞭解。
如果您已經有 Visual Studio,您可以從互動式開發環境 (IDE) 內安裝工作負載:
選取 工具>取得工具和功能。
在 Visual Studio 安裝程式中,選取 [工作負載] 標籤。
選取 Desktop 開發的 C++ 工作負載,然後選取 修改。
遵循提示並完成安裝。
本教學課程使用C++示範應用程式,以及呈現C++語法的螢幕快照。 大部分示範的功能也適用於 C#、Visual Basic、F#、Python、JavaScript 和 Visual Studio 所支援其他語言。 請記住一些限制:
F#:不支援 編輯後繼續 功能。
F# 和 JavaScript:不支援 [Autos] 視窗。
建立專案
請遵循下列步驟,在 Visual Studio 中建立C++控制台應用程式專案。 專案類型提供您需要快速開始使用的所有範本檔案:
在 Visual Studio [開始] 視窗中([檔案]>[開始視窗]),選取 [建立新專案] :
將 Language 篩選設定為 C++,並將 Platform 篩選設定為 Windows。
在 [搜尋] 方塊中,輸入 控制台,然後在結果清單中選取 [控制台應用程式] 範本:
注意
如果您沒有看到
主控台應用程式 樣本,您可以從 [建立新的 專案] 視窗安裝它。 找到搜尋結果後面的找不到您要尋找的內容? 區段,然後選擇安裝更多工具和功能。 在 Visual Studio 安裝程式中,選取具有 C++ 工作負載的 Desktop 開發,並更新您的安裝。 如需詳細資訊,請參閱 必要條件 一節。 選擇 [下一步] 以繼續前往組態頁面。
輸入 get-started-debugging 作為新應用程式 項目名稱 和 方案名稱。 選擇預設 位置,或流覽至您環境中的不同路徑。
選取 建立 來建立新的 Node.js 專案。
Visual Studio 會建立新的專案,並在 [方案總管] 中開啟項目階層。 get-started-debugging.cpp 檔案會在程式碼編輯器中開啟。
建立應用程式
在程式代碼編輯器中編輯 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 關閉視窗。
設定斷點並啟動調試程式
試著在除錯程式中選擇的點設定斷點並暫停。
傳回程式代碼編輯器中的 get-started-debugging.cpp 檔案,並找出
main
函式的for
迴圈:for (int i = 0; i < letters.size(); i++) { name += letters[i]; a[i] = i + 1; SendMessage(name, a[i]); }
在包含程式語句
name += letters[i];
的行上設定斷點,方法是在語句行的左側邊框選取。 Visual Studio 會在排水溝中新增紅色圓圈 ,以指出設定的斷點。提示
您也可以將游標放在程式碼行上,然後選取 F9 切換該行的斷點。
斷點是可靠偵錯的最基本和必要特性之一。 斷點表示您想要 Visual Studio 暫停執行中程式代碼的位置。 暫停執行時,您可以查看變數的值、檢查記憶體的行為,或檢查程式代碼的分支是否正在執行。
選取 F5 或 [開始偵錯],在偵錯工具中啟動應用程式。
Visual Studio 會開始執行您的應用程式。 當調試程式到達您的設定斷點時,偵錯程式會暫停。
Visual Studio 會將黃色箭號新增至邊欄中的紅色斷點圓形,以代表偵錯器暫停的程式碼語句。 程序執行已暫停,且指示的語句正在等候處理。
注意
F5 動作相對於您應用程式的目前執行狀態。 如果您的應用程式未執行,而且您選取 F5,調試程式會啟動您的應用程式並繼續執行,直到到達第一個設定斷點為止。 此行為會對應至 Debug>Start Debug 命令。 如果您的應用程式已在執行中,而且您選取 F5,應用程式執行會繼續執行,直到調試程式到達下一個斷點或程序結束為止。 此行為會對應至 Debug>Continue 命令。
當您知道想要詳細檢查的程式碼行或程式碼區段時,斷點是一項非常有用的功能。 如需您可以設定之不同斷點類型的資訊,例如條件式斷點,請參閱 使用正確的斷點類型。
使用偵錯工具逐步執行你的程序代碼
在偵錯工具中瀏覽您的程式碼的便利方式是使用 步驟命令。 這些命令可讓您 進入、越過、跳出 程式代碼區段,以及在應用程式執行中 向後執行。
下列程序強調如何使用鍵盤快捷方式搭配步驟命令,快速完成程序代碼。 (相應的功能表操作顯示在括弧中。)
選取 F5 或 [開始偵錯],在調試程式中啟動您的應用程式。
當調試程式在
main
函式的for
迴圈中暫停時,請選取 F11 (Debug > Step Into)兩次, 前進到SendMessage
方法呼叫。選取 F11 兩次之後,執行會接續至
SendMessage(name, a[i]);
程式碼語句。再次選取 F11,以進入
SendMessage
方法。請注意,黃色指標會前進到
SendMessage
方法:F11 鍵盤快捷鍵將啟動 逐步執行 命令,使應用程式每次執行一個語句。 這是一種可以最詳細地檢查執行流程的好方法。 根據預設,調試程式會略過非用戶程序代碼。 如需詳細資訊,請參閱 Just My Code。 稍後在此教學課程中,您將瞭解如何更快速地瀏覽您的程式碼。
檢查
SendMessage
方法之後,您可以使用 [Step Out 命令繼續偵錯。 選取 Shift + F11 (偵錯 > 跳出)。此命令會讓應用程式恢復執行(並推進調試器),直到目前的方法或函式返回為止。
當命令完成時,調試程式會在
main
方法的for
迴圈中SendMessage
方法呼叫處暫停。選取 F11 數次,直到您再次返回
SendMessage
方法呼叫為止。當偵錯工具在方法呼叫處暫停時,請選擇 F10 (偵錯 > 逐步略過)。
請注意,此時調試程式不會逐步執行
SendMessage
方法。 F10 快捷鍵會推進偵錯工具,而不需要逐步進入應用程式程式碼中的函式或方法(程式碼仍會執行)。 當您在SendMessage
方法呼叫上選取 F10 時(而不是 F11),逐步執行SendMessage
的實作程序代碼。 此方法適用於略過您目前不需要檢查的程式碼。 如需不同方式在程式代碼中移動的詳細資訊,請參閱 在除錯程式中巡覽程式碼。
使用「按一下執行」來瀏覽您的程式碼
在調試程式中完成程式代碼的另一個方法是使用 [執行] 按兩下 功能。 此動作類似於設定暫時斷點。
繼續除錯作業:
請選擇 F5,以跳到程式碼中的斷點。
在程式代碼編輯器中,捲動至
SendMessage
方法定義,並將滑鼠停留在std::wcout
函式上。將滑鼠懸停在程式碼語句左側,直到出現 [從執行到點擊] (綠色箭頭圖示)。 如果您將滑鼠停留在圖示上方,您會看到工具提示「執行到此處」:
選取 以執行 。
調試程式會將執行前進到指定的位置。 在此範例中,調試程式會呼叫
std::wcout
函式。
[Run to Click] 動作很方便,可以快速在應用程式程式碼的可見區域內瀏覽。 您可以在程式代碼編輯器開啟的任何檔案中使用此功能。
快速重新啟動您的應用程式
選取 [偵錯工具列] 中的 [重新啟動] (圓形箭號圖示) 來快速重新啟動您的應用程式。 您也可以選取 [偵錯] > [重新啟動],或使用 ctrl + Shift + F5 鍵盤快捷方式。
重新啟動 功能比停止應用程式並再次啟動調試程式更有效率。
當您選取 [重新啟動] 時,調試程式會在執行時遇到的第一個斷點處暫停。 在此範例中,調試程式會在您在 for
循環內設定的斷點再次停止。
使用數據提示檢查變數
可協助您檢查變數的功能是使用調試程式的最實用優點之一。 通常,當您偵錯問題時,您會嘗試探索變數是否在特定時間儲存預期的值。 Visual Studio 提供數種方式來協助您完成這項工作。
繼續進行偵錯會話:
在
name += letters[i]
語句上暫停調試程式時,將滑鼠停留在letters
變數上。 選取變數名稱左邊的展開/折迭箭號,並在飛出視窗功能表中檢視其屬性。數據提示 功能會顯示變數包含的所有元素。 請注意預設值,
size={10}
:接下來,將滑鼠停留在
name
變數上方,並注意其目前值,空字串 (""
)。選取 F5(偵錯>繼續)多次,重複執行
for
迴圈幾次。 每次調試程式在斷點暫停時,將滑鼠停留在name
變數上,並檢查目前的值:變數的值會隨著
for
迴圈的每個反覆運算而變更,其中顯示f
的值、fr
、fre
等等。
使用 [自動變數] 和 [局部變數] 視窗檢查變數
檢查變數和值的另一種方法是使用 自動偵測 和 本地變數 窗口。 在偵錯應用程式時,這些視窗預設會出現在 Visual Studio IDE 中的程式碼編輯器下方:
請注意程式碼編輯器下方的 [Autos] 視窗。
如果您在偵錯會話期間沒有看到視窗,請選取 [偵錯]>[Windows>自動] 來開啟視窗。
[自動] 視窗會顯示在目前行或前一行上使用的所有變數,以及其目前值。 請記住,特定程式設計語言可以示範變數和屬性的獨特行為。 如需詳細資訊,請參閱 Visual Studio 語言指引。
接下來,查看 局部 視窗。 根據預設,此視窗會對齊在 汽車 視窗旁。
如果您在偵錯會話期間沒有看到視窗,請選取 [偵錯]>[Windows]>[局部變數] 以開啟視窗。
在 本地變數 視窗中,展開
letters
變數以顯示其所包含的元素。[本地] 視窗會顯示目前 範圍中的變數,也就是目前的執行上下文。
監看變數
如果您想要監看特定變數的行為,您可以設定 監看:
在程式代碼編輯器中,以滑鼠右鍵單擊 name
變數,然後選取 [[新增監看式]。 [Watch] 視窗會在程式碼編輯器的下方開啟。 您可以使用 監看式 視窗來指定您想要追蹤的變數(或表示式)。
當您在調試程式中查看應用程式執行期間 name
變數時,您可以看到其值變更。 不同於其他變數視窗,監看 視窗一律會顯示您正在監看的變數。 當監看的變數不在範圍內時,變數名稱會呈現暗灰色。
檢查呼叫堆疊
Visual Studio 中的 [呼叫堆棧] 視窗會顯示呼叫方法和函式的順序。 此視窗類似於 Eclipse 等部分 IDE 中的偵錯透視圖。 根據預設,在程式代碼編輯器下方的偵錯會話期間,呼叫堆疊會顯示在右下窗格中。
在
for
循環中暫停調試程式時,請選取 [呼叫堆棧] 視窗以查看目前的呼叫結構。如果您在偵錯會話期間沒有看到視窗,請選取 [偵錯]>Windows>[呼叫堆棧] 來開啟視窗。
選取 F11(偵錯>逐步進入)幾次,直到偵錯工具暫停在
SendMessage
方法中。再次檢視 [呼叫堆疊] 視窗:
在 [呼叫堆疊] 視窗中,頂部會顯示目前的函式(此應用程式中的
SendMessage
方法)。 第二行顯示SendMessage
方法是從main
方法呼叫的,如此類推。
呼叫堆疊是檢查和瞭解應用程式執行流程的好方法:
按兩下一行程式碼以查看原始程式碼。 此動作也會變更調試程式正在檢查中的目前範圍,但不會推進調試程式。
在 [呼叫堆疊] 視窗中,存取程式設計元素的右鍵選單。 例如,您可以將斷點插入指定的函式、使用 Run 至 Cursor將調試程序前進,然後瀏覽至原始程式碼。 如需詳細資訊,請參閱 檢視呼叫堆疊,並在調試程式中使用 [呼叫堆棧] 視窗。
變更執行流程
Visual Studio 中調試程式的另一個功能是能夠變更應用程式的執行流程:
選取 F11 (偵錯>逐步執行)兩次來執行
std::wcout
函式。當除錯程式在
SendMessage
方法呼叫中暫停時,請選取黃色箭號,並將黃色箭號(執行指標)拖曳至變數左邊,並將箭號移至先前的程式代碼語句,std::wcout
。再次選取 F11。
調試程式會重新執行
std::wcout
函式。 您可以在終端機輸出中追蹤進程。藉由變更執行流程,您可以執行測試不同程式碼執行路徑或重新執行程式碼等動作,而不需重新啟動調試程式。
謹慎
使用這項功能時請小心注意。 當您選取黃色箭號時,Visual Studio 會在工具提示中顯示警告,指出執行變更可能會產生非預期的結果。 視您的案例而定,您可能會看到其他警告。 請記住,移動指標無法將您的應用程式還原為先前的應用程式狀態。
選取 [F5],以完成應用程式執行。