配置 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,macOS 上為 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
要除錯指定程式的 C++ 核心轉儲檔案的完整路徑。在 launch 配置中將其設定為要開始除錯的核心轉儲檔案的路徑。注意:Min Gw 不支援核心轉儲除錯。
遠端除錯或使用本地除錯伺服器進行除錯
miDebuggerServerAddress
要連線的除錯伺服器(例如 gdbserver)的網路地址,用於遠端除錯(示例:localhost:1234)。
debugServerPath
要啟動的除錯伺服器的完整路徑。
debugServerArgs
除錯伺服器的引數。
serverStarted
要在除錯伺服器輸出中查詢的伺服器啟動模式。支援正則表示式。
filterStdout
如果設定為 true,則在 stdout 流中搜索伺服器啟動模式並將 stdout 記錄到除錯輸出。預設值為 true。
filterStderr
如果設定為 true,則在 stderr 流中搜索伺服器啟動模式並將 stderr 記錄到除錯輸出。預設值為 false。
serverLaunchTimeout
偵錯程式等待 debugServer 啟動的時間(以毫秒為單位)。預設為 10000。
pipeTransport
有關附加到遠端程序的資訊,例如除錯 Docker 容器中的程序,請參閱 Pipe transport 設定文章。
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'。