在 Visual Studio Code 中除錯 C++
在為每個目標編譯器/平臺配置了除錯環境的基礎知識後,您可以在本節中瞭解更多關於在 Visual Studio Code 中除錯 C/C++ 的詳細資訊。
Visual Studio Code 支援以下 C/C++ 偵錯程式,具體取決於您使用的作業系統
- Linux:GDB
- macOS:LLDB 或 GDB
- Windows:Visual Studio Windows 偵錯程式或 GDB(使用 Cygwin 或 MinGW)
使用 GDB 進行 Windows 除錯
您可以使用 VS Code 除錯使用 Cygwin 或 MinGW 建立的 Windows 應用程式。要使用 Cygwin 或 MinGW 除錯功能,必須在啟動配置 (launch.json) 中手動設定偵錯程式路徑。要除錯您的 Cygwin 或 MinGW 應用程式,請新增 miDebuggerPath 屬性,並將其值設定為 Cygwin 或 MinGW 環境中相應 gdb.exe 的位置。
例如
"miDebuggerPath": "c:\\mingw\\bin\\gdb.exe"
Windows 上的 Cygwin/MinGW 除錯支援附加和啟動除錯場景。
要了解更多資訊,請參閱 配置 C/C++ 除錯。
如果您正在使用 GDB 在 Windows 上進行除錯,請參閱 使用 MinGW64 進行 Windows 除錯。
條件斷點
條件斷點使您能夠在特定程式碼行上中斷執行,前提是條件的值為 true。要設定條件斷點,請右鍵單擊現有斷點並選擇編輯斷點。這將開啟一個小的預覽視窗,您可以在其中輸入在除錯過程中要命中斷點必須求值為 true 的條件。

在編輯器中,條件斷點由一個內部帶有黑色等號的斷點符號表示。您可以將滑鼠懸停在條件斷點上以顯示其條件。
函式斷點
函式斷點使您能夠在函式開頭中斷執行,而不是在特定程式碼行中斷。要設定函式斷點,請在執行檢視中右鍵單擊斷點部分,然後選擇新增函式斷點並輸入要中斷執行的函式的名稱。
Expression evaluation
VS Code 在多種上下文中支援表示式求值
- 您可以將表示式鍵入執行檢視的監視部分,每次命中斷點時都會對其進行求值。
- 您可以將表示式鍵入除錯控制檯,它將只對其求值一次。
- 當您在斷點處停止時,可以對程式碼中出現的任何表示式進行求值。
監視部分中的表示式會影響正在除錯的應用程式;修改變數值的表示式將在程式執行期間修改該變數。
多執行緒除錯
VS Code 的 C/C++ 擴充套件能夠除錯多執行緒程式。所有執行緒及其呼叫堆疊都顯示在呼叫堆疊部分。

記憶體轉儲除錯
VS Code 的 C/C++ 擴充套件也能夠除錯記憶體轉儲。要除錯記憶體轉儲,請開啟您的 launch.json 檔案,並在C++ 啟動配置中新增 coreDumpPath(用於 GDB 或 LLDB)或 dumpPath(用於 Visual Studio Windows 偵錯程式)屬性,將其值設定為包含記憶體轉儲路徑的字串。即使在 x64 計算機上除錯 x86 程式,這也將起作用。
附加符號
如果偵錯程式可以找到符號檔案的附加目錄(例如,Visual Studio Windows 偵錯程式的 .pdb 檔案),則可以透過新增 additionalSOLibSearchPath(用於 GDB 或 LLDB)或 symbolSearchPath(用於 Visual Studio Windows 偵錯程式)來指定它們。
例如
"additionalSOLibSearchPath": "/path/to/symbols;/another/path/to/symbols"
或
"symbolSearchPath": "C:\\path\\to\\symbols;C:\\another\\path\\to\\symbols"
定位原始檔
如果原始檔不在編譯位置,則可以更改原始檔位置。這是透過在 sourceFileMap 部分中新增的簡單替換對來完成的。此列表中的第一個匹配項將被使用。
例如
"sourceFileMap": {
"/build/gcc-4.8-fNUjSI/gcc-4.8-4.8.4/build/i686-linux-gnu/libstdc++-v3/include/i686-linux-gnu": "/usr/include/i686-linux-gnu/c++/4.8",
"/build/gcc-4.8-fNUjSI/gcc-4.8-4.8.4/build/i686-linux-gnu/libstdc++-v3/include": "/usr/include/c++/4.8"
}
GDB、LLDB 和 LLDB-MI 命令 (GDB/LLDB)
對於 C++ (GDB/LLDB) 除錯環境,您可以透過 -exec 命令直接在除錯控制檯中執行 GDB、LLDB 和 LLDB-MI 命令,但請小心,直接在除錯控制檯中執行命令未經測試,在某些情況下可能導致 VS Code 崩潰。
其他除錯功能
- 無條件斷點
- 監視視窗
- 呼叫堆疊
- 單步執行
有關在 VS Code 中進行除錯的更多資訊,請參閱此介紹 VS Code 中的除錯。
有關配置 launch.json 檔案以除錯 C/C++ 應用程式的其他方法,請參閱 配置 C/C++ 除錯。
Natvis 框架
您可以使用 Natvis 框架在偵錯程式中建立 C++ 物件的自定義檢視。您可以閱讀 原生物件的自定義檢視 主題,瞭解有關將 Natvis 與 C/C++ 擴充套件一起使用的詳細資訊。
遠端除錯
有關附加到遠端程序的資訊,例如除錯 Docker 容器中的程序,請參閱 管道傳輸。
除錯偵錯程式
如果您在使用擴充套件時遇到除錯問題,而我們無法根據您的問題報告中的資訊進行診斷,我們可能會要求您啟用日誌記錄並向我們傳送您的日誌。請參閱 為除錯介面卡啟用日誌記錄,瞭解如何獲取 C/C++ 擴充套件日誌。
已知限制
符號和程式碼導航
所有平臺
- 由於擴充套件不解析函式體,因此檢視定義和轉到定義對於定義在函式體內的符號不起作用。
除錯
Windows
- Cygwin 和 MinGW 上的 GDB 無法中斷正在執行的程序。要在應用程式執行時(而不是在偵錯程式下停止)設定斷點,或者暫停正在除錯的應用程式,請在應用程式的終端中按 Ctrl-C。
- Cygwin 上的 GDB 無法開啟核心轉儲。
Linux
- 您可能會看到一個錯誤,提示:
ptrace: Operation not permitted。這是因為 GDB 需要提升的許可權才能附加到程序。可以使用以下解決方案解決此問題-
使用附加到程序時,需要在除錯會話開始前提供您的密碼。
-
要暫時停用此錯誤,請使用以下命令
echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope -
要永久刪除此錯誤,請在
/etc/sysctl.d/中建立一個名為10-ptrace.conf的檔案,並新增以下內容kernel.yama.ptrace_scope = 0。
-
macOS
- LLDB
- 使用 LLDB 進行除錯時,如果在中斷模式下關閉終端視窗,除錯不會停止。可以透過按停止按鈕來停止除錯。
- 停止除錯時,終端視窗不會關閉。
- GDB
- 在 macOS 上使用 GDB 需要額外的手動安裝步驟。請參閱 README 中的macOS 手動安裝 GDB。
- 使用 GDB 附加到程序時,無法中斷正在除錯的應用程式。GDB 只能繫結在應用程式未執行時設定的斷點(在附加到應用程式之前,或在應用程式處於停止狀態時)。這是由於 GDB 中的一個 bug。
- 在使用 GDB 進行除錯時,無法載入核心轉儲,因為 GDB 不支援 macOS 中使用的核心轉儲格式。
- 當使用 GDB 附加到程序時,break-all 會終止程序。
後續步驟
繼續閱讀以瞭解:
- 為適用於 Linux 的 Windows 子系統配置 VS Code
- 為 Mingw-w64 和 GCC 配置 VS Code
- 為 macOS 配置 VS Code
- 配置 C/C++ 除錯 - 瞭解其他偵錯程式配置選項。
- 基本編輯 - 瞭解功能強大的 Visual Studio Code 編輯器。
- 程式碼導航 - 快速瀏覽您的原始碼。
- 任務 - 使用任務來構建您的專案等。
- 除錯 - 瞭解 Visual Studio Code 偵錯程式。
如果您有其他問題或遇到任何問題,請在 GitHub 上提交問題。