Visual Studio Code (VSCode) 之 C/C++ 除錯配置詳解
準備
預設情況下,VSCode僅僅內建了對node.js執行時的除錯支援,只可以直接除錯JavaScript、TypeScript和任何其他翻譯為JavaScript的語言。其他語言的除錯支援,都是以外掛的形式提供支援。為了能夠除錯C/C++,必須首先安裝外掛:ms-vscode.cpptools
。直接在VSCode的外掛庫中安裝即可。
C/C++外掛是負責與VSCode的除錯規約打交道的,實際的除錯必須有對應的偵錯程式。目前在Windows下,VSCode支援GDB、LLDB、VC偵錯程式。
除錯配置
首先下載DGB環境。下載MinGW-w64(目前最新版為 5.01)。下載後將bin目錄新增到環境變數中。如下圖:
也可以選擇MinGW或者Cygwin。
VSCode的除錯使用起來很簡單,如下圖所示:
VSCode的特色之一就是原生支援線上除錯功能。VSCode 提供了兩種除錯方式:Launch和Attach。因此,在自動生成的配置檔案中,這兩種方式都會有。使用者需要那種配置哪一種即可,當然可以都配置好。這裡,我們選擇C++(GDB/LLDB)
之後,VSCode會自動生成lanuch.json
的檔案,如下:
{
"version": "0.2.0",
"configurations": [{
"name": "C++ Launch", // 配置名稱,將會在除錯配置下拉列表中顯示
"type": "cppdbg", // 偵錯程式型別:Windows表示器使用cppvsdbg;GDB和LLDB使用cppdbg。該值自動生成
"request": "launch", // 除錯方式
"program": "${workspaceRoot}/main.exe", // 要除錯的程式(完整路徑,支援相對路徑)
"args": [], // 傳遞給上面程式的引數,沒有引數留空即可
"stopAtEntry": false, // 是否停在程式入口點(停在main函式開始)
"cwd": "${workspaceRoot}", // 除錯程式時的工作目錄
"environment": [],
"externalConsole": true, // 除錯時是否顯示控制檯視窗
"linux": { // 下面是Linux平臺下,需要配置的引數,這裡暫時不用關心
"MIMode": "gdb",
"setupCommands": [{
"description": "Enable pretty-printing for gdb",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}]
},
"osx": { // 下面是Mac平臺下,需要配置的引數,這裡暫時不用關心
"MIMode": "lldb"
},
"windows": { // 下面是Windows平臺下,需要配置的引數
"MIMode": "gdb", // VSCode要使用的除錯工具
"miDebuggerPath": "E:\\mingw64\\bin\\gdb.exe", // miDebugger的路徑,該值必須設定。儘管會自動搜尋
"setupCommands": [{
"description": "Enable pretty-printing for gdb",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}]
}
},
{ // 不用關心
"name": "C++ Attach",
"type": "cppdbg",
"request": "attach",
"program": "${workspaceRoot}/main.exe",
"processId": "${command.pickProcess}", // 要Attach的程序ID
"linux": {
"MIMode": "gdb",
"setupCommands": [{
"description": "Enable pretty-printing for gdb",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}]
},
"osx": {
"MIMode": "lldb"
},
"windows": {
"MIMode": "gdb",
"setupCommands": [{
"description": "Enable pretty-printing for gdb",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}]
}
}
]
}
接下來對配置檔案進行詳細說明。配置檔案分為兩大部分:launch配置 和 attach配置。分別針對VSCode的兩種除錯方式。
vscode-cpptools除錯引數詳解
注意:以下為官方文件的翻譯。
配置VSCode的除錯行為
設定或更改以下選項以在除錯期間控制 VSCode 的行為:
**program:**需要除錯的程式(必須為完整程式路徑,可以使用VSCode的環境變數)
symbolSearchPath: 告訴Visual Studio Windows Debugger搜尋符號(.pdb)檔案的路徑。 用分號分隔多個路徑。
additionalSOLibSearchPath: 告訴GDB或LLDB搜尋.so檔案的路徑。 用分號分隔多個路徑。
externalConsole: 如果設定為true,則為應用程式啟動外部控制檯。 如果為false,則不會啟動控制檯,並使用VS Code的內建除錯控制檯。 請注意,由於技術原因,在某些情況下會忽略此選項。
logging: 可選標誌,用於確定應將哪些型別的訊息記錄到除錯控制檯
- exceptions:用於確定異常訊息是否應記錄到除錯控制檯的可選標誌。 預設為true。
- moduleLoad: 用於確定模組載入事件是否應記錄到除錯控制檯的可選標誌。 預設為true。
- programOutput: 用於確定程式輸出是否應記錄到除錯控制檯的可選標誌。 預設為true。
- engineLogging: 用於確定診斷引擎日誌是否應記錄到除錯控制檯的可選標誌。 預設為false。
- trace: 用於確定是否應將診斷介面卡命令跟蹤記錄到除錯控制檯的可選標誌。 預設為false。
- traceResponse: 用於確定是否應將診斷介面卡命令和響應跟蹤記錄到除錯控制檯的可選標誌。 預設為false。
visualizerFile: 除錯時使用.natvis 檔案. 使用方法參見 Natvis syntax reference
showDisplayString: 當指定visualizerFile時,showDisplayString將啟用顯示字串。 開啟此選項可能會導致除錯期間效能下降。
Example:
{
"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": "${workspaceRoot}/my.natvis",
"showDisplayString": "true"
}
配置目標應用程式
以下選項使您能夠在啟動時修改目標應用程式的狀態
args: 啟動時傳遞給程式的命令列引數的JSON資料。例如: ["arg1", "arg2]
.
cwd: 設定偵錯程式啟動的應用程式的工作目錄。
environment: 針對除錯的程式,要新增到環境中的環境變數. 例如: [ { "name": "squid", "value": "clam" } ]
。注意:如果不使用必須刪除,否則產生錯誤
Example:
{
"name": "C++ Launch",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceRoot}/a.out",
"args": ["arg1", "arg2"],
"environment": [{"name": "squid", "value": "clam"}],
"cwd": "${workspaceRoot}"
}
自定義GDB或LLDB
您可以通過設定以下選項來更改GDB或LLDB的行為。
MIMode: 指示VS程式碼將連線到的偵錯程式。 必須設定為gdb
或lldb
。這是基於每個作業系統預配置的,可以根據需要進行更改。
miDebuggerPath: 偵錯程式的路徑(必須是完整路徑)。 當未指定時,它將搜尋作業系統的PATH變數來尋找偵錯程式(Linux和Windows上的GDB,OS X上的LLDB)。
stopAtEntry: 如果設定為true,偵錯程式應該在目標的入口點停止(在attach方式時忽略)。 預設值為false
。
setupCommands: 設定GDB或LLDB的命令的JSON陣列。 例如:"setupCommands": [ { "text": "target-run", "description": "run target", "ignoreFailures": false }]
.
customLaunchSetupCommands: If provided, this replaces the default commands used to launch a target with some other commands. For example, this can be “-target-attach” in order to attach to a target process. An empty command list replaces the launch commands with nothing, which can be useful if the debugger is being provided launch options as command line options. Example: "customLaunchSetupCommands": [ { "text": "target-run", "description": "run target", "ignoreFailures": false }]
.
launchCompleteCommand: 完成偵錯程式設定後執行的命令,以便使目標程序執行。 允許的值為“exec-run”,“exec-continue”,“None”。 預設值為“exec-run”。
Example:
{
"name": "C++ Launch",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceRoot}/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"
}
}
除錯dump files
C / C ++擴充套件可以除錯Windows上的dump files和Linux和OS X上的core dump files
dumpPath: 如果要除錯Windows的dump files,請將其設定為dump files的路徑以在啟動配置中啟動除錯。
coreDumpPath: 指定程式除錯的core dump files的完整路徑。 將其設定為核心轉儲檔案的路徑,以在啟動配置中啟動除錯。
core dump除錯不受MinGw支援。
使用本地偵錯程式伺服器進行遠端除錯或本地除錯
miDebuggerServerAddress: 用於遠端除錯的要連線的偵錯程式伺服器(例如gdbserver)的網路地址(例如:localhost:1234
)。
debugServerPath: 除錯伺服器啟動的完整路徑。
debugServerArgs: 偵錯程式伺服器的引數。
serverStarted: Server-started pattern to look for in the debug server output.
serverLaunchTimeout: 偵錯程式等待debugServer啟動的時間(以毫秒為單位)。 預設值為10000。
其他屬性
processId: 預設為$ {command.pickProcess}
,它將顯示偵錯程式可以附加到的可用程序的列表。 建議保留此預設值,但可以將屬性顯式設定為偵錯程式附加到的特定程序ID。
request: 指示配置部分是要“啟動”程式還是“附加”到已經執行的例項。
targetArchitecture: Deprecated
不再需要此選項,自動檢測到目標體系結構。
type: 指示正在使用的底層偵錯程式。 在使用Visual Studio Windows偵錯程式時必須是“cppvsdbg”,在使用GDB或LLDB時必須是“cppdbg”。 在建立launch.json檔案時,會自動設定為正確的值。
注意:
- 部分不太瞭解的引數保留了原文
- 並不是所有引數都需要,部分引數在不使用時必須刪除。例如:
environment
關於VSCode編譯原始碼
VSCode用於強大的Task。VSCode的偵錯程式定義了大量的引數,其中就包括使用preLaunchTask:task名
引數呼叫指定的任務。在制定了該引數後,直接啟動除錯會出現以下提示:
點選Configure Task Runner後,會出現以下介面:
隨便選一個即可!然後,VSCode會自動生成名為Task.json
的檔案,修改如下即可:
{
"version": "0.1.0",
"command": "g++",
"args": ["-g", "${file}", "-o", "main.exe"], // 編譯命令引數
"problemMatcher": {
"owner": "cpp",
"fileLocation": ["relative", "${workspaceRoot}"],
"pattern": {
"regexp": "^(.*):(\\d+):(\\d+):\\s+(warning|error):\\s+(.*)$",
"file": 1,
"line": 2,
"column": 3,
"severity": 4,
"message": 5
}
}
}
關於VSCode的Task的詳細說明,參見官方文件。
關於VSCode的Debugging的詳細說明,參見官方文件。
除錯
來到除錯介面,執行除錯如下: