共用方式為


教學課程:使用Visual Studio對C++程式代碼進行偵錯

本文會在逐步解說中介紹Visual Studio調試程式的功能。 當您對應用程式進行偵錯時,通常會使用附加調試程式來執行應用程式。 調試程式提供許多方式來檢查程式代碼在程式執行期間執行的作業。 您可以逐步執行程式碼,查看儲存在變數中的值,並設定監視變數,以便了解值何時變更。 調試程式可協助您檢查程式代碼的執行路徑,並確認程式代碼的分支正在執行。

在本教學課程中,您會:

  • 啟動調試程式並在斷點暫停
  • 了解命令以在調試器中逐步執行程式碼
  • 檢查數據提示和調試程序視窗中的變數
  • 檢查呼叫堆疊

如果您不熟悉偵錯,建議您在開始本教學課程之前,先閱讀 給絕對初學者的偵錯指南。 如果您要更上層的除錯程式功能檢視,請參閱 第一次查看除錯程式

先決條件

  • 已安裝 C++ 工作負載的 Visual Studio 2022 17.12 版或更新版本 桌面開發。

    • 如果您已經有 Visual Studio,您可以從互動式開發環境 (IDE) 內安裝工作負載:

      1. 選取 工具>取得工具和功能

      2. 在 Visual Studio 安裝程式中,選取 [工作負載] 標籤

      3. 選取 Desktop 開發的 C++ 工作負載,然後選取 修改

      4. 遵循提示並完成安裝。

  • 本教學課程使用C++示範應用程式,以及呈現C++語法的螢幕快照。 大部分示範的功能也適用於 C#、Visual Basic、F#、Python、JavaScript 和 Visual Studio 所支援其他語言。 請記住一些限制:

    • F#:不支援 編輯後繼續 功能。

    • F#JavaScript:不支援 [Autos] 視窗。

建立專案

請遵循下列步驟,在 Visual Studio 中建立C++控制台應用程式專案。 專案類型提供您需要快速開始使用的所有範本檔案:

  1. 在 Visual Studio [開始] 視窗中([檔案]>[開始視窗]),選取 [建立新專案]

    顯示如何在 Visual Studio [開始] 視窗中選取 [建立新專案] 選項的螢幕快照。

  2. Language 篩選設定為 C++,並將 Platform 篩選設定為 Windows

  3. 在 [搜尋] 方塊中,輸入 控制台,然後在結果清單中選取 [控制台應用程式] 範本:

    顯示如何在 Visual Studio 2022 [開始] 視窗中搜尋並選取主控台應用程式範本的螢幕快照。

    顯示如何在 Visual Studio [開始] 視窗中搜尋並選取主控台應用程式範本的螢幕快照。

    注意

    如果您沒有看到 主控台應用程式 樣本,您可以從 [建立新的 專案] 視窗 安裝它。 找到搜尋結果後面的找不到您要尋找的內容? 區段,然後選擇安裝更多工具和功能。 在 Visual Studio 安裝程式中,選取具有 C++ 工作負載的 Desktop 開發,並更新您的安裝。 如需詳細資訊,請參閱 必要條件 一節。

  4. 選擇 [下一步] 以繼續前往組態頁面。

  5. 輸入 get-started-debugging 作為新應用程式 項目名稱方案名稱。 選擇預設 位置,或流覽至您環境中的不同路徑。

  6. 選取 建立 來建立新的 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;
}

啟動調試程式

現在您已準備好開始偵錯更新的程式代碼:

  1. 選取 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
    

    稍後在本教學課程中,您會更仔細地查看調試程式中的這個應用程式,並探索其他偵錯功能。

  2. 在 [偵錯] 工具列中選擇 [停止] (紅色方塊圖示)以中斷偵錯。 您也可以使用 Shift + F5 鍵盤快捷方式。

  3. 在執行中應用程式的主控台視窗中,選取任何索引鍵,然後選取 [Enter 關閉視窗。

設定斷點並啟動調試程式

試著在除錯程式中選擇的點設定斷點並暫停。

  1. 傳回程式代碼編輯器中的 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]);
       }
    
  2. 在包含程式語句 name += letters[i]; 的行上設定斷點,方法是在語句行的左側邊框選取。 Visual Studio 會在排水溝中新增紅色圓圈 ,以指出設定的斷點。

    提示

    您也可以將游標放在程式碼行上,然後選取 F9 切換該行的斷點。

    斷點是可靠偵錯的最基本和必要特性之一。 斷點表示您想要 Visual Studio 暫停執行中程式代碼的位置。 暫停執行時,您可以查看變數的值、檢查記憶體的行為,或檢查程式代碼的分支是否正在執行。

  3. 選取 F5[開始偵錯],在偵錯工具中啟動應用程式。

    Visual Studio 會開始執行您的應用程式。 當調試程式到達您的設定斷點時,偵錯程式會暫停。

    Visual Studio 會將黃色箭號新增至邊欄中的紅色斷點圓形,以代表偵錯器暫停的程式碼語句。 程序執行已暫停,且指示的語句正在等候處理。

    顯示調試程式在 Visual Studio 中設定斷點上暫停的螢幕快照。

    注意

    F5 動作相對於您應用程式的目前執行狀態。 如果您的應用程式未執行,而且您選取 F5,調試程式會啟動您的應用程式並繼續執行,直到到達第一個設定斷點為止。 此行為會對應至 Debug>Start Debug 命令。 如果您的應用程式已在執行中,而且您選取 F5,應用程式執行會繼續執行,直到調試程式到達下一個斷點或程序結束為止。 此行為會對應至 Debug>Continue 命令。

當您知道想要詳細檢查的程式碼行或程式碼區段時,斷點是一項非常有用的功能。 如需您可以設定之不同斷點類型的資訊,例如條件式斷點,請參閱 使用正確的斷點類型

使用偵錯工具逐步執行你的程序代碼

在偵錯工具中瀏覽您的程式碼的便利方式是使用 步驟命令。 這些命令可讓您 進入越過跳出 程式代碼區段,以及在應用程式執行中 向後執行

顯示調試程式工具列中步驟命令的螢幕快照。

下列程序強調如何使用鍵盤快捷方式搭配步驟命令,快速完成程序代碼。 (相應的功能表操作顯示在括弧中。)

  1. 選取 F5[開始偵錯],在調試程式中啟動您的應用程式。

  2. 當調試程式在 main 函式的 for 迴圈中暫停時,請選取 F11Debug > Step Into兩次, 前進到 SendMessage 方法呼叫。

    選取 F11 兩次之後,執行會接續至 SendMessage(name, a[i]);程式碼語句。

  3. 再次選取 F11,以進入 SendMessage 方法。

    請注意,黃色指標會前進到 SendMessage 方法:

    顯示偵錯程式已進入 SendMessage 方法的螢幕快照,以及黃色箭頭指示器指出暫停位置。

    F11 鍵盤快捷鍵將啟動 逐步執行 命令,使應用程式每次執行一個語句。 這是一種可以最詳細地檢查執行流程的好方法。 根據預設,調試程式會略過非用戶程序代碼。 如需詳細資訊,請參閱 Just My Code。 稍後在此教學課程中,您將瞭解如何更快速地瀏覽您的程式碼。

  4. 檢查 SendMessage 方法之後,您可以使用 [Step Out 命令繼續偵錯。 選取 Shift + F11 (偵錯 > 跳出)。

    此命令會讓應用程式恢復執行(並推進調試器),直到目前的方法或函式返回為止。

    當命令完成時,調試程式會在 main 方法的 for 迴圈中 SendMessage 方法呼叫處暫停。

  5. 選取 F11 數次,直到您再次返回 SendMessage 方法呼叫為止。

  6. 當偵錯工具在方法呼叫處暫停時,請選擇 F10偵錯 > 逐步略過)。

    螢幕快照顯示調試器略過了 SendMessage 方法,並且黃色指標指出了暫停位置。

    請注意,此時調試程式不會逐步執行 SendMessage 方法。 F10 快捷鍵會推進偵錯工具,而不需要逐步進入應用程式程式碼中的函式或方法(程式碼仍會執行)。 當您在 SendMessage 方法呼叫上選取 F10 時(而不是 F11),逐步執行SendMessage的實作程序代碼。 此方法適用於略過您目前不需要檢查的程式碼。 如需不同方式在程式代碼中移動的詳細資訊,請參閱 在除錯程式中巡覽程式碼

使用「按一下執行」來瀏覽您的程式碼

在調試程式中完成程式代碼的另一個方法是使用 [執行] 按兩下 功能。 此動作類似於設定暫時斷點。

繼續除錯作業:

  1. 請選擇 F5,以跳到程式碼中的斷點。

  2. 在程式代碼編輯器中,捲動至 SendMessage 方法定義,並將滑鼠停留在 std::wcout 函式上。

    將滑鼠懸停在程式碼語句左側,直到出現 [從執行到點擊] (綠色箭頭圖示)。 如果您將滑鼠停留在圖示上方,您會看到工具提示「執行到此處」:

    顯示偵錯工具中 [執行至點選] 功能以及操作提示的螢幕快照。

  3. 選取 以執行

    調試程式會將執行前進到指定的位置。 在此範例中,調試程式會呼叫 std::wcout 函式。

[Run to Click] 動作很方便,可以快速在應用程式程式碼的可見區域內瀏覽。 您可以在程式代碼編輯器開啟的任何檔案中使用此功能。

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

選取 [偵錯工具列] 中的 [重新啟動] (圓形箭號圖示) 來快速重新啟動您的應用程式。 您也可以選取 [偵錯] > [重新啟動]或使用 ctrl + Shift + F5 鍵盤快捷方式。

重新啟動 功能比停止應用程式並再次啟動調試程式更有效率。

當您選取 [重新啟動] 時,調試程式會在執行時遇到的第一個斷點處暫停。 在此範例中,調試程式會在您在 for 循環內設定的斷點再次停止。

使用數據提示檢查變數

可協助您檢查變數的功能是使用調試程式的最實用優點之一。 通常,當您偵錯問題時,您會嘗試探索變數是否在特定時間儲存預期的值。 Visual Studio 提供數種方式來協助您完成這項工作。

繼續進行偵錯會話:

  1. name += letters[i] 語句上暫停調試程式時,將滑鼠停留在 letters 變數上。 選取變數名稱左邊的展開/折迭箭號,並在飛出視窗功能表中檢視其屬性。

    數據提示 功能會顯示變數包含的所有元素。 請注意預設值,size={10}

    動畫,示範如何檢查調試程式中變數的屬性和值。

  2. 接下來,將滑鼠停留在 name 變數上方,並注意其目前值,空字串 ("")。

  3. 選取 F5偵錯>繼續)多次,重複執行 for 迴圈幾次。 每次調試程式在斷點暫停時,將滑鼠停留在 name 變數上,並檢查目前的值:

    顯示螢幕快照,展示如何在調試程式中將滑鼠懸停以顯示數據提示,從而檢查變數的值。

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

使用 [自動變數] 和 [局部變數] 視窗檢查變數

檢查變數和值的另一種方法是使用 自動偵測本地變數 窗口。 在偵錯應用程式時,這些視窗預設會出現在 Visual Studio IDE 中的程式碼編輯器下方:

在偵錯會話期間,顯示調試程式中程式代碼編輯器下方的 [自動變數] 和 [局部變數] 視窗的螢幕快照。

  1. 請注意程式碼編輯器下方的 [Autos] 視窗。

    如果您在偵錯會話期間沒有看到視窗,請選取 [偵錯]>[Windows>自動] 來開啟視窗。

    [自動] 視窗會顯示在目前行或前一行上使用的所有變數,以及其目前值。 請記住,特定程式設計語言可以示範變數和屬性的獨特行為。 如需詳細資訊,請參閱 Visual Studio 語言指引

  2. 接下來,查看 局部 視窗。 根據預設,此視窗會對齊在 汽車 視窗旁。

    如果您在偵錯會話期間沒有看到視窗,請選取 [偵錯]>[Windows]>[局部變數] 以開啟視窗。

  3. 本地變數 視窗中,展開 letters 變數以顯示其所包含的元素。

    顯示如何在 Visual Studio 2022 的 [局部變數] 視窗中檢查變數和值的螢幕快照。

    顯示如何在 Visual Studio 的 [局部變數] 視窗中檢查變數和值的螢幕快照。

    [本地] 視窗會顯示目前 範圍中的變數,也就是目前的執行上下文。

監看變數

如果您想要監看特定變數的行為,您可以設定 監看

在程式代碼編輯器中,以滑鼠右鍵單擊 name 變數,然後選取 [[新增監看式]。 [Watch] 視窗會在程式碼編輯器的下方開啟。 您可以使用 監看式 視窗來指定您想要追蹤的變數(或表示式)。

顯示 [監看式] 視窗的螢幕快照,其中顯示Visual Studio 中名稱變數的值。

當您在調試程式中查看應用程式執行期間 name 變數時,您可以看到其值變更。 不同於其他變數視窗,監看 視窗一律會顯示您正在監看的變數。 當監看的變數不在範圍內時,變數名稱會呈現暗灰色。

檢查呼叫堆疊

Visual Studio 中的 [呼叫堆棧] 視窗會顯示呼叫方法和函式的順序。 此視窗類似於 Eclipse 等部分 IDE 中的偵錯透視圖。 根據預設,在程式代碼編輯器下方的偵錯會話期間,呼叫堆疊會顯示在右下窗格中。

  1. for 循環中暫停調試程式時,請選取 [呼叫堆棧] 視窗以查看目前的呼叫結構。

    如果您在偵錯會話期間沒有看到視窗,請選取 [偵錯]>Windows>[呼叫堆棧] 來開啟視窗。

  2. 選取 F11偵錯>逐步進入)幾次,直到偵錯工具暫停在 SendMessage 方法中。

  3. 再次檢視 [呼叫堆疊] 視窗:

    顯示如何在 Visual Studio 2022 中檢查呼叫堆疊的螢幕快照。

    顯示如何在Visual Studio中檢查呼叫堆疊的螢幕快照。

    在 [呼叫堆疊] 視窗中,頂部會顯示目前的函式(此應用程式中的 SendMessage 方法)。 第二行顯示 SendMessage 方法是從 main 方法呼叫的,如此類推。

呼叫堆疊是檢查和瞭解應用程式執行流程的好方法:

  • 按兩下一行程式碼以查看原始程式碼。 此動作也會變更調試程式正在檢查中的目前範圍,但不會推進調試程式。

  • [呼叫堆疊] 視窗中,存取程式設計元素的右鍵選單。 例如,您可以將斷點插入指定的函式、使用 Run 至 Cursor將調試程序前進,然後瀏覽至原始程式碼。 如需詳細資訊,請參閱 檢視呼叫堆疊,並在調試程式中使用 [呼叫堆棧] 視窗

變更執行流程

Visual Studio 中調試程式的另一個功能是能夠變更應用程式的執行流程:

  1. 選取 F11偵錯>逐步執行)兩次來執行 std::wcout 函式。

  2. 當除錯程式在 SendMessage 方法呼叫中暫停時,請選取黃色箭號,並將黃色箭號(執行指標)拖曳至變數左邊,並將箭號移至先前的程式代碼語句,std::wcout

  3. 再次選取 F11

    調試程式會重新執行 std::wcout 函式。 您可以在終端機輸出中追蹤進程。

    藉由變更執行流程,您可以執行測試不同程式碼執行路徑或重新執行程式碼等動作,而不需重新啟動調試程式。

    謹慎

    使用這項功能時請小心注意。 當您選取黃色箭號時,Visual Studio 會在工具提示中顯示警告,指出執行變更可能會產生非預期的結果。 視您的案例而定,您可能會看到其他警告。 請記住,移動指標無法將您的應用程式還原為先前的應用程式狀態。

  4. 選取 [F5],以完成應用程式執行。