分享方式:


教學課程:了解如何使用 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++ 主控台應用程式專案。 在您新增任何項目之前,專案類型會隨附您需要的所有範本檔案!

  1. 開啟 Visual Studio。

    如果啟動視窗未開啟,請選擇 [檔案]>[啟動視窗]

  2. 在開始視窗中,選擇 [建立新專案]

  3. 在 [建立新專案] 視窗的搜尋方塊中輸入或鍵入 ASP.NET。 接下來,從語言清單中選擇 C++,然後從平台清單中選擇 Windows

    在您套用語言和平台的篩選條件之後,請選擇 [主控台應用程式] 範本,然後選擇 [下一步]

    Screenshot of choosing the C++ template for the Console App.

    Screenshot of choosing the C++ template for the Console App.

    注意

    如果您未看到 [主控台應用程式] 範本,您可以從 [建立新專案] 視窗中安裝。 在 [找不到你要尋找的項目嗎?] 訊息中,選擇 [安裝更多工具和功能] 連結。 然後,在 Visual Studio 安裝程式中選擇 [使用 C++ 的桌面開發] 工作負載。

  4. 在 [設定您的新專案] 視窗的 [專案名稱] 方塊中,鍵入或輸入 get-started-debugging。 接著,選擇 [建立]

    Visual Studio 會隨即開啟您的新專案。

建立應用程式

  1. 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;
    }
    

啟動偵錯工具!

  1. F5 ([偵錯] > [開始偵錯]) 或偵錯工具列中的 [開始偵錯] 按鈕 Start Debugging

    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
    

    在本教學課程中,我們將使用偵錯工具仔細查看這個應用程式,並了解偵錯工具功能。

  2. 按下紅色停止 Stop Debugging 按鈕 (Shift + F5) 來停止偵錯工具。

  3. 在主控台視窗中,按下一鍵和 Enter 鍵以關閉主控台視窗。

設定中斷點,並啟動偵錯工具

  1. main 函式的 for 迴圈中,按一下下列程式碼行的左邊界來設定中斷點:

    name += letters[i];

    您設定中斷點的位置會出現紅色圓圈 Breakpoint

    中斷點是可靠偵錯的其中一個最基本且必要功能。 中斷點會指出 Visual Studio 應暫停程式碼執行的地方,如此一來您可以查看變數的值或記憶體的行為,或查看程式碼分支是否正在執行。

  2. 按下 F5 或 [開始偵錯] 按鈕 Start Debugging,應用程式會啟動,而偵錯工具會執行到您設定中斷點的程式碼行。

    Screenshot of setting and hitting a breakpoint.

    黃色箭號表示偵錯工具暫停時的陳述式,這也表示會在相同的點暫停執行應用程式 (尚未執行此陳述式)。

    如果尚未執行應用程式,則 F5 鍵會啟動偵錯工具並在第一個中斷點停止。 否則,F5 鍵會繼續執行應用程式到下一個中斷點。

    如果您知道要詳細檢查的程式碼行或程式碼區段,則中斷點是一個很有用的功能。 如需您可以設定之不同中斷點類型的資訊,例如條件中斷點,請參閱使用中斷點

在大部分情況下,我們會在這裡使用鍵盤快速鍵,因為這是在偵錯工具中快速執行應用程式的好方法 (功能表命令等對等命令會顯示在括弧內)。

  1. main 方法的 for 迴圈中暫停時,請按 F11 (或選擇 [偵錯 > 逐步執行]) 兩次,以前進到 SendMessage 方法呼叫。

    按下 F11 兩次之後,您應該會在這一行程式碼中:

    SendMessage(name, a[i]);

  2. 再按 F11 一次,以逐步執行 SendMessage 方法。

    黃色指標會前進至 SendMessage 方法。

    Screenshot of using F11 to Step Into code.

    F11 鍵是逐步執行命令,可將應用程式執行一次往前推進一個陳述式。 F11 鍵是以最詳細的方式檢查執行流程的好方法。 (若要更快速地在程式碼中移動,我們也會示範一些其他選項。)根據預設,偵錯工具會略過非使用者程式碼 (如果您想要更多的詳細資料,請參閱 Just My Code)。

    假設您已完成檢查 SendMessage 方法,而您想要退出方法,但會留在偵錯工具中。 您可以使用 [跳離函式] 命令完成這項動作。

  3. 按下 Shift + F11 (或 [偵錯] [跳離函式]>)。

    此命令會繼續應用程式執行 (並推進偵錯工具),直到目前的方法或函式傳回為止。

    您應該回到 main 方法中的 for 迴圈,在 SendMessage 方法呼叫時暫停。

  4. F11 數次,直到您再次回到 SendMessage 方法呼叫為止。

  5. 在方法呼叫暫停時,按下 F10 (或選擇 [偵錯>逐步執行]) 一次。

    Screenshot of using F10 to Step Over code.

    請注意,此時偵錯工具不會逐步執行 SendMessage 方法。 F10 鍵會推進偵錯工具,而不需要逐步執行應用程式程式碼中的函式或方法 (此程式碼仍會執行)。 藉由在 SendMessage 方法呼叫上按 F10 鍵 (而非 F11 鍵),我們略過了 SendMessage 的實作程式碼 (現在對我們不太重要)。 如需不同方式在程式碼中移動的詳細資訊,請參閱在偵錯工具中巡覽程式碼

  1. 按下 F5,前進到中斷點。

  2. 在程式碼編輯器中,向下捲動並將滑鼠停留在 SendMessage 方法的 std::wcout 函式上方,直到綠色 [執行至點選處] 按鈕 Run to Click 出現在左側為止。 按鈕的工具提示會顯示「執行到這裡」。

    Screenshot of using the Run to Click feature.

    注意

    [執行至點選處] 按鈕是 Visual Studio 2017 的新功能。 (如果您沒有看到綠色箭號按鈕,請在此範例中改用 F11,將偵錯工具推進到正確的位置。)

  3. 按一下 [執行至點選處] 按鈕 Run to Click

    偵錯工具會前進到 std::wcout 函式。

    使用此按鈕類似於設定暫時中斷點。 [執行至點選處] 方便您在應用程式程式碼的可見區域內快速瀏覽 (您可以按一下任何開啟的檔案)。

快速重新啟動您的應用程式

按一下 [偵錯工具列] 中的 [重新啟動]Restart App 按鈕 (Ctrl + Shift + F5)。

相對於停止應用程式並重新啟動偵錯工具,按下 [重新啟動] 可讓您節省時間。 偵錯工具會在執行程式碼叫用的第一個中斷點處暫停。

偵錯工具會在您先前在 for 迴圈內設定的中斷點再次停止。

使用資料提示來檢查變數

可讓您檢查變數的功能是偵錯工具最實用功能之一,而且有不同的方法來完成此作業。 通常當您嘗試偵錯問題時,您會嘗試確定變數是否會儲存您希望其在特定時間具有的值。

  1. name += letters[i] 陳述式上暫停時,將滑鼠停留在 letters 變數上方,您會看到其預設值,即 size={10}

  2. 展開 letters 變數以查看其屬性,其中包括變數包含的所有元素。

  3. 接下來,將滑鼠停留在 name 變數上,您會看到其目前值 (空字串)。

  4. F5 (或偵錯>繼續),多次逐一查看 for 迴圈、在中斷點再次暫停,並在每次檢查其值時停留在 name 變數上。

    Screenshot of viewing a data tip.

    變數的值會隨著 for 迴圈的每個反覆項目而變更,其中顯示 f 的值、frfre 等等。

    很多時候,您會希望在偵錯時快速檢查變數的屬性值,以查看其是否如您預期的儲存值,而資料提示是很適合的方法。

使用 [自動變數] 和 [區域變數] 視窗來檢查變數

  1. 查看程式碼編輯器底部的 [自動變數] 視窗。

    如果已關閉,選擇 [偵錯]>[視窗]>[自動變數] 在偵錯工具暫停時將其開啟。

    在 [自動變數] 視窗中,您會看到變數及其目前的值。 [自動變數] 視窗會顯示在目前行或前述行 (請查看文件以了解語言特定行為) 中使用的所有變數。

  2. 接下來,在 [自動變數] 視窗旁的索引標籤中查看 [區域變數] 視窗。

  3. 展開 letters 變數以顯示其所包含的元素。

    Screenshot of inspecting variables in the Locals Window.

    Screenshot of inspecting variables in the Locals Window.

    [區域變數] 視窗會顯示位在目前範圍中的變數,即為目前執行內容。

設定監看式

  1. 在主要程式碼編輯器視窗中,以滑鼠右鍵按一下 name 變數,並選擇 [新增監看式]

    [監看式] 視窗隨即在程式碼編輯器底部開啟。 您可以使用 [監看式] 視窗來指定您要留意的變數 (或運算式)。

    現在,您已於 name 變數上設定監看式,當您在偵錯工具中移動時,就可以看到其值的變更。 不同於其他變數視窗,[監看式] 視窗一律會顯示所監看的變數 (它們在超出範圍時會呈現灰色)。

檢查呼叫堆疊

  1. for 迴圈中暫停時,按一下 [呼叫堆疊] 視窗,此視窗預設會在右下方的窗格中開啟。

    如果已關閉,選擇 [偵錯]>[視窗]>[呼叫堆疊] 在偵錯工具暫停時將其開啟。

  2. 按一下 F11 幾次,直到您在 SendMessage 方法中看到偵錯工具暫停為止。 查看 [呼叫堆疊] 視窗。

    Screenshot of examining the call stack.

    Screenshot of examining the call stack.

    [呼叫堆疊] 視窗會顯示方法和函式的呼叫順序。 第一行會顯示目前的函式 (此應用程式中的 SendMessage 方法)。 第二行會顯示已從 main 方法呼叫 SendMessage,依此類推。

    注意

    [呼叫堆疊] 視窗類似於某些 IDE (例如 Eclipse) 中的 [偵錯] 檢視方塊。

    呼叫堆疊是檢查並了解應用程式執行流程的好方法。

    您可以按兩下某一行的程式碼來查看其原始程式碼,這也會變更偵錯工具所檢查的目前範圍。 此動作不會讓偵錯工具往前推進。

    您也可以從 [呼叫堆疊] 視窗使用滑鼠右鍵功能表來執行其他動作。 例如,您可以在指定的函式中插入中斷點,使用 [執行至游標處] 讓偵錯工具往前推進,並檢查原始程式碼。 如需詳細資訊,請參閱如何:檢查呼叫堆疊

變更執行流程

  1. F11 兩次以執行 std::wcout 函式。

  2. 偵錯工具在 SendMessage 方法呼叫中暫停後,使用滑鼠抓取左側的黃色箭號 (執行指標),然後將黃色箭號上移一行回到 std::wcout

  3. 按下 F11

    偵錯工具會重新執行 std::wcout 函式 (您會在主控台視窗輸出中看到此函式)。

    藉由變更執行流程,您可以執行一些作業,例如測試不同的程式碼執行路徑,或重新執行程式碼而不重新啟動偵錯工具。

    警告

    您通常需要謹慎使用這項功能,您會在工具提示中看到一則警告。 也可能會看到其他警告。 移動指標無法將應用程式還原成先前的應用程式狀態。

  4. F5 鍵繼續執行應用程式。

    恭喜您完成此教學課程!

下一步

在本教學課程中,您已了解如何啟動偵錯工具、逐步執行程式碼,以及檢查變數。 建議您進一步查看偵錯工具功能,以及詳細資訊的連結。