配置 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 將連線到的偵錯程式。必須設定為 gdb
或 lldb
。這是按作業系統預配置的,可以根據需要進行更改。
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,則始終使用硬體斷點。預設值為 false
。limit
是對可用硬體斷點數量的可選限制,僅在 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”。