在 Visual Studio Code 中調試 C++

當您根據各個目標編譯器/平台的設定教學課程完成調試環境的基本設定後,您可以在本節中深入了解有關調試 C/C++ 的更多詳細資訊。

Visual Studio Code 根據您使用的作業系統,支援以下 C/C++ 調試器:

  • Linux: GDB
  • macOS: LLDB 或 GDB
  • Windows: Visual Studio Windows 調試器或 GDB(使用 Cygwin 或 MinGW)

在 Windows 上使用 GDB 調試

您可以使用 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 調試支援附加 (attach) 和啟動 (launch) 調試情境。

若要了解更多資訊,請參閱 設定 C/C++ 調試

如果您在 Windows 上使用 GDB 進行調試,請參閱 使用 MinGW64 進行 Windows 調試

條件式中斷點

條件中斷點允許您僅在條件值為真 (true) 時,才在程式碼的特定行中斷執行。若要設定條件中斷點,請右鍵點擊現有的中斷點並選擇編輯中斷點 (Edit Breakpoint)。這會開啟一個小型預覽視窗,您可以在其中輸入條件;調試期間,該條件必須評估為真,中斷點才會觸發。

A conditional break

在編輯器中,條件中斷點會以內部帶有黑色等號的中斷點符號表示。您可以將滑鼠游標懸停在條件中斷點上以查看其條件。

函式中斷點

函式中斷點允許您在函式開頭中斷執行,而不是在程式碼的特定行中斷。若要設定函式中斷點,請在執行 (Run) 檢視中,於中斷點 (Breakpoints) 區域內點擊右鍵,然後選擇新增函式中斷點 (Add Function Breakpoint) 並輸入您想要中斷執行所在的函式名稱。

運算式評估

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

  • 您可以在執行 (Run) 檢視的監看 (Watch) 區域輸入運算式,每當觸發中斷點時,該運算式都會被重新評估。
  • 您可以在調試控制台 (Debug Console) 中輸入運算式,它只會被評估一次。
  • 當您在斷點處停止時,可以評估程式碼中出現的任何運算式。

監看 (Watch) 區域中的運算式會作用於正在調試的應用程式;若運算式修改了變數的值,該變數的值在程式執行期間將會被更改。

多執行緒調試

VS Code 的 C/C++ 擴充功能具備調試多執行緒程式的能力。所有執行緒及其呼叫堆疊都會顯示在呼叫堆疊 (Call Stack) 區域中。

Multi-threaded process

記憶體傾印 (Memory dump) 調試

VS Code 的 C/C++ 擴充功能也具備調試記憶體傾印 (memory dump) 的能力。若要調試記憶體傾印,請開啟您的 launch.json 檔案,並在 C++ Launch 設定中新增 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 當機。

其他調試功能

  • 無條件中斷點
  • 監看視窗
  • 呼叫堆疊
  • 逐步執行 (Stepping)

如需有關使用 VS Code 調試的更多資訊,請參閱這篇 VS Code 調試簡介

如需設定 launch.json 檔案以調試 C/C++ 應用程式的其他方法,請參閱 設定 C/C++ 調試

Natvis 架構

您可以使用 Natvis 架構在調試器中建立 C++ 物件的自訂檢視。您可以閱讀 原生物件的自訂檢視 主題,以了解有關在 C/C++ 擴充功能中使用 Natvis 的詳細資訊。

遠端調試

有關附加至遠端處理序(例如調試 Docker 容器中的處理序)的資訊,請參閱 管道傳輸 (Pipe transport)

調試調試器

如果您在使用擴充功能進行調試時遇到問題,且我們無法根據您提供的報告進行診斷,我們可能會請您啟用日誌記錄並將日誌寄給我們。請參閱 啟用調試介面卡的日誌記錄 以了解如何取得 C/C++ 擴充功能的日誌。

已知限制

符號與程式碼導覽

所有平台

  • 由於該擴充功能不會剖析函式本體,因此查看定義 (Peek Definition)前往定義 (Go to Definition) 對函式內部定義的符號無效。

偵錯

Windows

  • Cygwin 和 MinGW 上的 GDB 無法中斷正在執行的處理序。若要在應用程式執行時(未在調試器下暫停)設定中斷點,或暫停正在調試的應用程式,請在應用程式的終端機中按下 Ctrl-C
  • Cygwin 上的 GDB 無法開啟核心傾印 (core dumps)。

Linux

  • 您可能會看到錯誤訊息:ptrace: Operation not permitted。這是因為 GDB 需要提升權限才能附加至處理序。這可以使用以下解決方案來解決:
    1. 當使用附加至處理序 (attach to process) 時,您需要在調試工作階段開始前輸入您的密碼。

    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 調試時,如果在中斷模式下關閉終端機視窗,調試不會停止。可以透過按下停止 (Stop) 按鈕來停止調試。
    • 當調試停止時,終端機視窗不會關閉。
  • GDB
    • 在 macOS 上使用 GDB 需要額外的手動安裝步驟。請參閱 README 中的 Manual Installation of GDB for OS X
    • 當使用 GDB 附加至處理序時,無法中斷正在調試的應用程式。GDB 只會綁定在應用程式未執行時(在附加至應用程式之前,或應用程式處於已停止狀態時)設定的中斷點。這是因為 GDB 的一個錯誤
    • 使用 GDB 調試時無法載入核心傾印,因為 GDB 不支援 macOS 使用的核心傾印格式
    • 當使用 GDB 附加至處理序時,「全部中斷 (break-all)」將會結束該處理序。

後續步驟

繼續閱讀以了解

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

© . This site is unofficial and not affiliated with Microsoft.