在 Visual Studio Code 中偵錯 C++

在您依照各目標編譯器/平台設定教學設定偵錯環境的基本要素後,您可以在本節中深入了解 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 進行偵錯,請參閱Windows 上的 MinGW64 偵錯

條件式中斷點

條件式中斷點可讓您僅在條件值為 true 時,在特定程式碼行中斷執行。若要設定條件式中斷點,請以滑鼠右鍵按一下現有的中斷點,然後選取編輯中斷點。這會開啟一個小型預覽視窗,您可以在其中輸入必須評估為 true 的條件,以便在偵錯期間命中中斷點。

A conditional break

在編輯器中,條件式中斷點會以中斷點符號表示,其中包含黑色等號。您可以將游標放在條件式中斷點上方,以顯示其條件。

函式中斷點

函式中斷點可讓您在函式開頭中斷執行,而不是在特定的程式碼行。若要設定函式中斷點,請在執行檢視中,以滑鼠右鍵按一下中斷點區段內,然後選擇新增函式中斷點,並輸入您要中斷執行之函式的名稱。

運算式評估

VS Code 在多種情況下支援運算式評估

  • 您可以將運算式輸入至執行檢視的監看式區段,每次命中中斷點時都會評估該運算式。
  • 您可以將運算式輸入至偵錯主控台,而且只會評估一次。
  • 您可以在停在中斷點時,評估程式碼中出現的任何運算式。

監看式區段中的運算式會在偵錯中的應用程式中生效;修改變數值的運算式將在程式執行期間修改該變數。

多執行緒偵錯

VS Code 的 C/C++ 擴充功能能夠偵錯多執行緒程式。所有執行緒及其呼叫堆疊都會顯示在呼叫堆疊區段中

Multi-threaded process

記憶體傾印偵錯

VS Code 的 C/C++ 擴充功能也具有偵錯記憶體傾印的能力。若要偵錯記憶體傾印,請開啟您的 launch.json 檔案,並將 coreDumpPath (適用於 GDB 或 LLDB) 或 dumpPath (適用於 Visual Studio Windows 偵錯工具) 屬性新增至 C++ 啟動組態,將其值設定為包含記憶體傾印路徑的字串。即使是在 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++ 物件的自訂檢視。您可以閱讀原生物件的自訂檢視主題,以取得有關搭配 C/C++ 擴充功能使用 Natvis 的詳細資訊。

遠端偵錯

如需有關附加至遠端程序 (例如偵錯 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. 若要永久移除錯誤,請將名為 10-ptrace.conf 的檔案新增至 /etc/sysctl.d/,並新增下列 kernel.yama.ptrace_scope = 0

macOS

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

後續步驟

繼續閱讀以了解

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