默认情况下,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 的行为:
**program:**需要调试的程序(必须为完整程序路径,可以使用VSCode的环境变量)
symbolSearchPath: 告诉Visual Studio Windows Debugger搜索符号(.pdb)文件的路径。 用分号分隔多个路径。
additionalSOLibSearchPath: 告诉GDB或LLDB搜索.so文件的路径。 用分号分隔多个路径。
externalConsole: 如果设置为true,则为应用程序启动外部控制台。 如果为false,则不会启动控制台,并使用VS Code的内置调试控制台。 请注意,由于技术原因,在某些情况下会忽略此选项。
logging: 可选标志,用于确定应将哪些类型的消息记录到调试控制台
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的行为。
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"
}
}
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用于强大的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的详细说明,参见官方文档。
vscode-cpptools