參加你附近的 ,瞭解 VS Code 中的 AI 輔助開發。

在 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++ 除錯

如果你正在 Windows 上使用 GDB 進行除錯,請參閱使用 MinGW64 進行 Windows 除錯

條件斷點

條件斷點使你僅在條件值為 true 時才在特定程式碼行處中斷執行。要設定條件斷點,請右鍵單擊現有斷點並選擇編輯斷點。這將開啟一個小型窺視視窗,你可以在其中輸入在除錯期間命中斷點必須評估為 true 的條件。

A conditional break

在編輯器中,條件斷點由內部帶有黑色等號的斷點符號表示。你可以將游標放在條件斷點上以顯示其條件。

函式斷點

函式斷點使你可以在函式開頭而不是特定程式碼行處中斷執行。要設定函式斷點,請在執行檢視中右鍵單擊斷點部分內部,然後選擇新增函式斷點並輸入要中斷執行的函式名稱。

Expression evaluation

VS Code 支援在多種上下文中進行表示式求值

  • 你可以在執行檢視的監視部分中鍵入表示式,每次命中斷點時都會對其進行求值。
  • 你可以在除錯控制檯中鍵入表示式,並且只對它求值一次。
  • 在斷點處停止時,你可以對程式碼中出現的任何表示式求值。

監視部分中的表示式在被除錯的應用程式中生效;修改變數值的表示式將在程式執行期間修改該變數。

多執行緒除錯

VS Code 的 C/C++ 擴充套件能夠除錯多執行緒程式。所有執行緒及其呼叫堆疊都顯示在呼叫堆疊部分

Multi-threaded process

記憶體轉儲除錯

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 需要提升的許可權才能附加到程序。這可以使用以下解決方案解決
    1. 使用附加到程序時,你需要在除錯會話開始前提供密碼。

    2. 要暫時停用此錯誤,請使用以下命令

      echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope

    3. 要永久消除此錯誤,請在 /etc/sysctl.d/ 中新增名為 10-ptrace.conf 的檔案,並新增以下內容 kernel.yama.ptrace_scope = 0

macOS

  • LLDB
    • 使用 LLDB 除錯時,如果在中斷模式下關閉終端視窗,除錯不會停止。可以透過按停止按鈕來停止除錯。
    • 除錯停止時,終端視窗不會關閉。
  • GDB
    • 在 macOS 上使用 GDB 需要額外的手動安裝步驟。請參閱 README 中的“適用於 OS X 的 GDB 手動安裝”。
    • 使用 GDB 附加到程序時,被除錯的應用程式無法中斷。GDB 只會繫結在應用程式未執行時(在附加到應用程式之前,或在應用程式處於停止狀態時)設定的斷點。這是由於 GDB 中的一個錯誤
    • 使用 GDB 除錯時無法載入核心轉儲,因為 GDB 不支援 macOS 中使用的核心轉儲格式
    • 使用 GDB 附加到程序時,全部中斷將終止程序。

後續步驟

繼續閱讀以瞭解:

如果你有任何其他問題或遇到任何問題,請在 GitHub 上提交問題。