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

配置 C/C++ 除錯

launch.json 檔案用於配置 Visual Studio Code 中的偵錯程式

Visual Studio Code 會生成一個 launch.json 檔案(在專案中的 .vscode 資料夾下),其中包含幾乎所有必需的資訊。要開始除錯,您需要填寫 program 欄位,其中包含您計劃除錯的可執行檔案的路徑。這必須為啟動和附加(如果您打算在任何時候附加到正在執行的例項)配置指定。

生成的檔案包含兩個部分,一個用於配置啟動除錯,另一個用於配置附加除錯。

配置 VS Code 的除錯行為

設定或更改以下選項以控制 VS Code 在除錯期間的行為

program (必需)

指定偵錯程式將啟動或附加到的可執行檔案的完整路徑。偵錯程式需要此位置才能載入除錯符號。

symbolSearchPath

告訴 Visual Studio Windows 偵錯程式搜尋符號 (.pdb) 檔案的路徑。多個路徑用分號分隔。例如:"C:\\Symbols;C:\\SymbolDir2"

requireExactSource

一個可選標誌,告訴 Visual Studio Windows 偵錯程式要求當前原始碼與 pdb 匹配。

additionalSOLibSearchPath

告訴 GDB 或 LLDB 搜尋 .so 檔案的路徑。多個路徑用分號分隔。例如:"/Users/user/dir1;/Users/user/dir2"

externalConsole

僅在啟動除錯物件時使用。對於 attach,此引數不會改變除錯物件的行為。

  • Windows:當設定為 true 時,它將生成一個外部控制檯。當設定為 false 時,它將使用 VS Code 的 integratedTerminal。
  • Linux:當設定為 true 時,它將通知 VS Code 生成一個外部控制檯。當設定為 false 時,它將使用 VS Code 的 integratedTerminal。
  • macOS:當設定為 true 時,它將透過 lldb-mi 生成一個外部控制檯。當設定為 false 時,輸出可以在 VS Code 的 debugConsole 中看到。由於 lldb-mi 的限制,不支援 integratedTerminal。

avoidWindowsConsoleRedirection

為了支援 VS Code 在 Windows 上與 gdb 整合的終端,該擴充套件將控制檯重定向命令新增到除錯物件的引數中,以使控制檯輸入和輸出顯示在整合終端中。將此選項設定為 true 將停用它。

logging

可選標誌,用於確定應記錄到除錯控制檯的訊息型別。

  • exceptions:可選標誌,用於確定是否應將異常訊息記錄到除錯控制檯。預設為 true。
  • moduleLoad:可選標誌,用於確定是否應將模組載入事件記錄到除錯控制檯。預設為 true。
  • programOutput:可選標誌,用於確定是否應將程式輸出記錄到除錯控制檯。預設為 true。
  • engineLogging:可選標誌,用於確定是否應將診斷引擎日誌記錄到除錯控制檯。預設為 false。
  • trace:可選標誌,用於確定是否應將診斷介面卡命令跟蹤記錄到除錯控制檯。預設為 false。
  • traceResponse:可選標誌,用於確定是否應將診斷介面卡命令和響應跟蹤記錄到除錯控制檯。預設為 false。

visualizerFile

除錯時使用的 .natvis 檔案。有關如何建立 Natvis 檔案的資訊,請參見建立本機物件的自定義檢視

showDisplayString

當指定了 visualizerFile 時,showDisplayString 將啟用顯示字串。開啟此選項可能會導致除錯期間效能下降。

示例

{
  "name": "C++ Launch (Windows)",
  "type": "cppvsdbg",
  "request": "launch",
  "program": "C:\\app1\\Debug\\app1.exe",
  "symbolSearchPath": "C:\\Symbols;C:\\SymbolDir2",
  "externalConsole": true,
  "logging": {
    "moduleLoad": false,
    "trace": true
  },
  "visualizerFile": "${workspaceFolder}/my.natvis",
  "showDisplayString": true
}

配置目標應用程式

以下選項允許您在啟動目標應用程式時修改其狀態

args

啟動程式時傳遞給程式的命令列引數的 JSON 陣列。示例 ["arg1", "arg2"]。如果您正在跳脫字元,則需要雙重轉義它們。例如,["{\\\"arg1\\\": true}"] 將向您的應用程式傳送 {"arg1": true}

cwd

設定偵錯程式啟動的應用程式的工作目錄。

environment

要新增到程式環境中的環境變數。示例:[ { "name": "config", "value": "Debug" } ],而不是 [ { "config": "Debug" } ]

示例

{
  "name": "C++ Launch",
  "type": "cppdbg",
  "request": "launch",
  "program": "${workspaceFolder}/a.out",
  "args": ["arg1", "arg2"],
  "environment": [{ "name": "config", "value": "Debug" }],
  "cwd": "${workspaceFolder}"
}

自定義 GDB 或 LLDB

您可以透過設定以下選項來更改 GDB 或 LLDB 的行為

MIMode

指示 VS Code 將連線到的偵錯程式。必須設定為 gdblldb。這是按作業系統預配置的,可以根據需要進行更改。

miDebuggerPath

偵錯程式的路徑(例如 gdb)。當只指定可執行檔案時,它將搜尋作業系統的 PATH 變數以查詢偵錯程式(Linux 和 Windows 上的 GDB,OS X 上的 LLDB)。

miDebuggerArgs

要傳遞給偵錯程式的其他引數(例如 gdb)。

stopAtEntry

如果設定為 true,偵錯程式應在目標的入口點停止(附加時忽略)。預設值為 false

stopAtConnect

如果設定為 true,偵錯程式應在連線到目標後停止。如果設定為 false,偵錯程式將在連線後繼續。預設值為 false

setupCommands

用於設定 GDB 或 LLDB 的要執行的命令的 JSON 陣列。示例:"setupCommands": [ { "text": "target-run", "description": "run target", "ignoreFailures": false }]

customLaunchSetupCommands

如果提供,這將用一些其他命令替換用於啟動目標的預設命令。例如,這可以是“-target-attach”以附加到目標程序。一個空的命令列表會用空替換啟動命令,如果偵錯程式透過命令列選項提供啟動選項,這會很有用。示例:"customLaunchSetupCommands": [ { "text": "target-run", "description": "run target", "ignoreFailures": false }]

launchCompleteCommand

在偵錯程式完全設定後執行的命令,以使目標程序執行。允許的值為“exec-run”、“exec-continue”、“None”。預設值為“exec-run”。

示例

{
  "name": "C++ Launch",
  "type": "cppdbg",
  "request": "launch",
  "program": "${workspaceFolder}/a.out",
  "stopAtEntry": false,
  "customLaunchSetupCommands": [
    { "text": "target-run", "description": "run target", "ignoreFailures": false }
  ],
  "launchCompleteCommand": "exec-run",
  "linux": {
    "MIMode": "gdb",
    "miDebuggerPath": "/usr/bin/gdb"
  },
  "osx": {
    "MIMode": "lldb"
  },
  "windows": {
    "MIMode": "gdb",
    "miDebuggerPath": "C:\\MinGw\\bin\\gdb.exe"
  }
}

symbolLoadInfo

  • loadAll:如果為 true,將載入所有庫的符號,否則不載入任何 solib 符號。由 ExceptionList 修改。預設值為 true。
  • exceptionList:檔名列表(允許萬用字元),用分號 ; 分隔。修改 LoadAll 的行為。如果 LoadAll 為 true,則不載入與列表中任何名稱匹配的庫的符號。否則只加載與匹配的庫的符號。示例:"foo.so;bar.so"

除錯轉儲檔案

C/C++ 擴充套件支援在 Windows 上除錯轉儲檔案以及在 Linux 和 OS X 上除錯核心轉儲檔案。

dumpPath

如果您想除錯 Windows 轉儲檔案,請將其設定為轉儲檔案的路徑,以在 launch 配置中開始除錯。

coreDumpPath

要除錯指定程式的核心轉儲檔案的完整路徑。將其設定為核心轉儲檔案的路徑,以在 launch 配置中開始除錯。注意:MinGw 不支援核心轉儲除錯。

遠端除錯或使用本地偵錯程式伺服器進行除錯

miDebuggerServerAddress

偵錯程式伺服器(例如 gdbserver)的網路地址,用於遠端除錯(示例:localhost:1234)。

debugServerPath

要啟動的除錯伺服器的完整路徑。

debugServerArgs

偵錯程式伺服器的引數。

serverStarted

要在除錯伺服器輸出中查詢的伺服器啟動模式。支援正則表示式。

filterStdout

如果設定為 true,則搜尋 stdout 流以查詢伺服器啟動模式並將 stdout 記錄到除錯輸出。預設值為 true

filterStderr

如果設定為 true,則搜尋 stderr 流以查詢伺服器啟動模式並將 stderr 記錄到除錯輸出。預設值為 false

serverLaunchTimeout

偵錯程式等待 debugServer 啟動的毫秒數。預設值為 10000。

pipeTransport

有關附加到遠端程序(例如除錯 Docker 容器中的程序)的資訊,請參閱管道傳輸設定文章。

hardwareBreakpoints

如果提供,此選項明確控制遠端目標的硬體斷點行為。如果 require 設定為 true,則始終使用硬體斷點。預設值為 falselimit 是對可用硬體斷點數量的可選限制,僅在 require 為 true 且 limit 大於 0 時才強制執行。預設值為 0。示例:"hardwareBreakpoints": { require: true, limit: 6 }

附加屬性

processId

預設為 ${command:pickProcess},它將顯示偵錯程式可以附加到的可用程序列表。我們建議您保留此預設值,但可以將此屬性明確設定為偵錯程式要附加到的特定程序 ID。

request

指示配置部分是旨在 launch 程式還是 attach 到已執行的例項。

targetArchitecture

已棄用 此選項不再需要,因為目標架構會自動檢測。

type

指示正在使用的底層偵錯程式。使用 Visual Studio Windows 偵錯程式時必須為 cppvsdbg,使用 GDB 或 LLDB 時必須為 cppdbg。建立 launch.json 檔案時,此項會自動設定為正確的值。

sourceFileMap

這允許將原始碼的編譯時路徑對映到本地原始碼位置。它是一個鍵/值對的物件,將解析第一個字串匹配的路徑。(示例:"sourceFileMap": { "/mnt/c": "c:\\" } 將對映偵錯程式返回的任何以 /mnt/c 開頭的路徑並將其轉換為 c:\\。您可以在物件中包含多個對映,但它們將按照提供的順序處理。)

環境變數定義檔案

環境變數定義檔案是一個簡單的文字檔案,其中包含 environment_variable=value 形式的鍵值對,並使用 # 作為註釋。不支援多行值。

cppvsdbg 偵錯程式配置還包含一個 envFile 屬性,允許您輕鬆設定用於除錯目的的變數。

例如

project.env 檔案:

# project.env

# Example environment with key as 'MYENVRIONMENTPATH' and value as C:\\Users\\USERNAME\\Project
MYENVRIONMENTPATH=C:\\Users\\USERNAME\\Project

# Variables with spaces
SPACED_OUT_PATH="C:\\This Has Spaces\\Project"

符號選項

symbolOptions 元素允許自定義偵錯程式搜尋符號的方式。示例

    "symbolOptions": {
        "searchPaths": [
            "C:\\src\\MyOtherProject\\bin\\debug",
            "https://my-companies-symbols-server"
        ],
        "searchMicrosoftSymbolServer": true,
        "cachePath": "%TEMP%\\symcache",
        "moduleFilter": {
            "mode": "loadAllButExcluded",
            "excludedModules": [ "DoNotLookForThisOne*.dll" ]
        }
    }

屬性

searchPaths:符號伺服器 URL(例如:https://msdl.microsoft.com/download/symbols)或目錄(例如:/build/symbols)的陣列,用於搜尋 .pdb 檔案。除了預設位置(模組旁邊和 pdb 最初放置的路徑)之外,還將搜尋這些目錄。

searchMicrosoftSymbolServer:如果為 true,則將 Microsoft 符號伺服器 (https://msdl.microsoft.com/download/symbols) 新增到符號搜尋路徑。如果未指定,此選項預設為 false

cachePath:從符號伺服器下載的符號應快取的目錄。如果未指定,偵錯程式將預設為 %TEMP%\SymbolCache。

moduleFilter.mode:此值為 "loadAllButExcluded""loadOnlyIncluded"。在 "loadAllButExcluded" 模式下,偵錯程式會載入所有模組的符號,除非模組在“excludedModules”陣列中。在 "loadOnlyIncluded" 模式下,偵錯程式不會嘗試載入任何模組的符號,除非它在“includedModules”陣列中,或者透過“includeSymbolsNextToModules”設定包含它。

"loadAllButExcluded" 模式的屬性

moduleFilter.excludedModules:偵錯程式不應載入符號的模組陣列。支援萬用字元(例如:MyCompany.*.dll)。

"loadOnlyIncluded" 模式的屬性

moduleFilter.includedModules:偵錯程式應載入符號的模組陣列。支援萬用字元(例如:MyCompany.*.dll)。

moduleFilter.includeSymbolsNextToModules:如果為 true,對於不在“includedModules”陣列中的任何模組,偵錯程式仍將檢查模組本身旁邊和啟動可執行檔案,但不會檢查符號搜尋列表上的路徑。此選項預設為“true”。