Visual Studio Code (VSCode) 之 C/C++ 调试配置详解

准备

  默认情况下,VSCode仅仅内置了对node.js运行时的调试支持,只可以直接调试JavaScript、TypeScript和任何其他翻译为JavaScript的语言。其他语言的调试支持,都是以插件的形式提供支持。为了能够调试C/C++,必须首先安装插件:ms-vscode.cpptools。直接在VSCode的插件库中安装即可。
  C/C++插件是负责与VSCode的调试规约打交道的,实际的调试必须有对应的调试器。目前在Windows下,VSCode支持GDBLLDBVC调试器

调试配置

  首先下载DGB环境。下载MinGW-w64(目前最新版为 5.01)。下载后将bin目录添加到环境变量中。如下图:
Visual Studio Code (VSCode) 之 C/C++ 调试配置详解_第1张图片
也可以选择MinGW或者Cygwin。

VSCode的调试使用起来很简单,如下图所示:
Visual Studio Code (VSCode) 之 C/C++ 调试配置详解_第2张图片
  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代码将连接到的调试器。 必须设置为gdblldb。这是基于每个操作系统预配置的,可以根据需要进行更改。

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文件时,会自动设置为正确的值。

注意:

  1. 部分不太了解的参数保留了原文
  2. 并不是所有参数都需要,部分参数在不使用时必须删除。例如:environment

关于VSCode编译源码

  VSCode用于强大的Task。VSCode的调试器定义了大量的参数,其中就包括使用preLaunchTask:task名参数调用指定的任务。在制定了该参数后,直接启动调试会出现以下提示:
Visual Studio Code (VSCode) 之 C/C++ 调试配置详解_第3张图片
点击Configure Task Runner后,会出现以下界面:
Visual Studio Code (VSCode) 之 C/C++ 调试配置详解_第4张图片
随便选一个即可!然后,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的详细说明,参见官方文档。

调试

来到调试界面,运行调试如下:
Visual Studio Code (VSCode) 之 C/C++ 调试配置详解_第5张图片

参考

vscode-cpptools

你可能感兴趣的:(Visual,Studio,Code(VSCode))