共用方式為


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

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

在本教學課程中,您會:

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

如果您不熟悉偵錯,建議您先閱讀 偵錯絕對初學者,再開始本教學課程。 如果您想概覽除錯器的功能,請參閱 初探除錯器

先決條件

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

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

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

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

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

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

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

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

    • F#JavaScriptAutos 視窗不支援。

建立專案

請遵循下列步驟,在 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 檔案,並找出 for 函式的 main 迴圈:

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

    在您選取 F11 兩次後,程式會繼續執行到語句 SendMessage(name, a[i]);

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

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

    顯示調試器進入 SendMessage 方法的螢幕快照,以及黃色指標指示暫停位置。

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

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

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

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

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

  6. 當偵錯器在方法呼叫處暫停時,請選取 F10偵錯 > 逐步執行)。

    顯示偵錯工具略過 SendMessage 方法的螢幕快照,以及顯示暫停位置的黃色指標。

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

使用“點擊執行”功能瀏覽您的程式代碼

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

繼續進行偵錯會話:

  1. 選取 F5,以進到程式代碼中的斷點。

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

    將滑鼠停留在 [運行至點擊](綠色箭號圖示) 出現在程式碼左側。 如果您將滑鼠停留在圖示上方,您會看到工具提示「執行至這裡」:

    顯示了執行至點選功能和動作工具提示的調試器螢幕快照。

  3. 選取 並點擊

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

[快速點擊執行] 功能非常便利,可在應用程式目前顯示的程式代碼區域內快速導航。 您可以在程式代碼編輯器開啟的任何檔案中使用此功能。

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

選取 [偵錯工具列] 中的 [重新啟動] (圓形箭號圖示) 來快速重新啟動您的應用程式。 您也可以選取 [偵錯] > [重新啟動]或使用 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. 請注意程式代碼編輯器下方的 [自動] 視窗。

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

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

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

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

  3. [局部變數] 視窗中,展開 letters 變數以顯示它所包含的元素。

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

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

    [局部變數] 視窗會顯示目前 範圍中的變數,也就是目前的執行內容。

監看變數

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

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

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

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

檢查呼叫堆疊

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

  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],以完成應用程式執行。