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