本站点文档内容均翻译自code.visualstudio.com,仅供个人学习,如有差异请以官网为准。

配置 C/C++ 调试

一个launch.json 文件用于配置 调试器 在 Visual Studio Code 中。

Visual Studio Code 生成一个launch.json(在下.vscode文件夹中几乎包含了所有必需的信息。要开始调试,您需要填写程序指定用于调试的可执行文件的路径的字段。这必须为启动和附加(如果您计划在任何时候附加到正在运行的实例)配置指定。

生成的文件包含两个部分,一部分用于启动调试,另一部分用于附加调试。

配置 VS Code 的调试行为

设置或更改以下选项以控制 VS Code 在调试期间的行为:

程序(必填)

指定调试器将启动或附加到的可执行文件的完整路径。调试器需要此位置来加载调试符号。

符号搜索路径

告诉Visual Studio Windows调试器要搜索符号(.pdb)文件的路径。多个路径之间用分号分隔。例如:&C:\\Symbols;C:\\SymbolDir2&D输入:.

需要精确来源

一个可选标志,告诉Visual Studio Windows调试器要求当前源代码与pdb匹配。

附加的SOLib搜索路径

告诉 GDB 或 LLDB 要搜索 .so 文件的路径。用分号分隔多个路径。例如:"/Users/user/dir1;/Users/user/dir2"输入:.

外部控制台

仅在启动调试程序时使用。对于附加这个参数不会改变被调试程序的行为。

  • Windows:当设置为 true 时,将启动一个外部控制台。当设置为 false 时,将使用 VS Code 的集成终端。
  • Linux:当设置为 true 时,它将通知 VS Code 启动一个外部控制台。当设置为 false 时,它将使用 VS Code 的集成终端。
  • macOS:当设置为 true 时,它将通过 lldb-mi当设置为 false 时,输出可以在 VS Code 的 debugConsole 中看到。由于内部限制lldb-mi集成终端支持不可用。

避免Windows控制台重定向

为了在 Windows 上支持 VS Code 的集成终端与 gdb,该扩展将重定向控制台的命令添加到调试目标的参数中,以便在集成终端中显示控制台的输入和输出。将此选项设置为将禁用它。

日志记录

可选标志,用于确定应记录到调试控制台的消息类型。

  • 异常:可选标志,用于确定是否将异常消息记录到调试控制台。默认为 true。
  • moduleLoad:可选标志,用于确定是否将模块加载事件记录到调试控制台。默认为 true。
  • programOutput:可选标志,用于确定程序输出是否应记录到调试控制台。默认为 true。
  • engineLogging:可选标志,用于确定是否将诊断引擎日志记录到调试控制台。默认值为 false。
  • 跟踪:可选标志,用于确定是否将诊断适配器命令跟踪记录到调试控制台。默认值为 false。
  • traceResponse:可选标志,用于确定是否将诊断适配器命令和响应跟踪记录到调试控制台。默认值为 false。

可视化文件

. natvis 调试时使用的文件。请参阅 创建本地对象的自定义视图 了解如何创建 Natvis 文件。

显示字符串

当一个可视化文件指定显示字符串将启用显示字符串。开启此选项可能会在调试期间导致性能下降。

示例:

{
  "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
}

配置目标应用程序

以下选项使您能够在启动目标应用程序时修改其状态:

参数

JSON数组,用于在启动程序时传递给程序的命令行参数。示例["arg1", "arg2"]如果你正在转义字符,你需要将它们双转义。例如,["{\"arg1\": true}"]将发送{"arg1": true}提交您的申请。

当前工作目录

设置由调试器启动的应用程序的工作目录。

环境

为程序添加到环境中的环境变量。示例:[ { "name": "config", "value": "Debug" } ],不是[ { "config": "调试" } ]输入:.

示例:

{
  "name": "C++ 启动",
  "type": "cppdbg",
  "request": "launch",
  "program": "${workspaceFolder}/a.out",
  "args": ["arg1", "arg2"],
  "environment": [{ "name": "config", "value": "Debug" }],
  "cwd": "${workspaceFolder}"
}

定制 GDB 或 LLDB

您可以通过设置以下选项来更改GDB或LLDB的行为:

多任务处理模式

指示调试器 VS Code 将连接到。必须设置为gdblldb这是基于操作系统预先配置的,可以根据需要进行更改。

miDebuggerPath

调试器的路径(例如gdb)。当仅指定可执行文件时,它将搜索操作系统PATH变量中的调试器(Linux和Windows上的GDB,OS X上的LLDB)。

miDebuggerArgs

传递给调试器(如gdb)的附加参数。

在入口处停止

如果设置为 true,调试器应在目标的入口点处停止(附加时忽略)。默认值是输入:.

停止连接

如果设置为 true,调试器在连接到目标后应停止。如果设置为 false,调试器在连接后将继续。默认值是输入:.

设置命令

用于设置 GDB 或 LLDB 的命令按顺序执行的 JSON 数组。示例:"setupCommands": [ { "text": "target-run", "description": "运行目标", "ignoreFailures": false }]输入:.

自定义启动设置命令

如果提供,这将用其他命令替换用于启动目标的默认命令。例如,这可以是“-target-attach”,以便附加到目标进程。空命令列表将用无操作替换启动命令,这在调试器作为命令行选项提供启动选项时很有用。示例:"customLaunchSetupCommands": [ { "text": "target-run", "description": "run target", "ignoreFailures": false } ]输入:.

发射完成命令

在调试器完全设置后执行的命令,以使目标进程运行。允许的值是 "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"
  }
}

符号加载信息

  • loadAll:如果为真,将加载所有库的符号,否则将不加载任何共享库符号。由ExceptionList修改。默认值为真。
  • exceptionList:以分号分隔的文件名列表(允许使用通配符)输入:;修改 LoadAll 的行为。如果 LoadAll 为真,则不加载与列表中任何名称匹配的库的符号。否则仅加载与匹配的库的符号。示例:"foo.so;bar.so"

调试转储文件

C/C++ 扩展可以在 Windows 上调试转储文件,并在 Linux 和 OS X 上调试核心转储文件。

转储路径

如果您想调试一个Windows转储文件,请将此设置为转储文件的路径以开始调试发射配置。

核心转储路径

用于调试指定程序的内核转储文件的完整路径。将此设置为内核转储文件的路径以开始调试发射 配置。 注意:MinGw 不支持核心转储调试。

远程调试或使用本地调试器服务器进行调试

miDebugger服务器地址

用于远程调试的调试器服务器(例如,gdbserver)的网络地址(示例:本地主机:1234)。

调试服务器路径

启动调试服务器的完整路径。

调试服务器参数

调试器服务器的参数。

服务器已启动

在调试服务器输出中查找的服务器启动模式。支持正则表达式。

过滤标准输出

如果设置为真,搜索标准输出流式传输服务器启动的模式,并将stdout日志记录到调试输出。默认值是输入:.

过滤标准错误流

如果设置为真,搜索标准错误输出流用于服务器启动的模式,并将stderr日志记录到调试输出。默认值是输入:.

服务器启动超时

以毫秒为单位,调试器等待调试服务器启动的时间。默认是10000。

管道传输

有关连接到远程进程的信息,例如在Docker容器中调试进程,请参阅Pipe transport设置文章。

硬件断点

如果提供,这将显式控制远程目标的硬件断点行为。如果要求如果设置为 true,则始终使用硬件断点。默认值是限制是一个可选的限制,限制可以使用的硬件断点的数量,仅在以下情况下才会强制执行要求是真的并且限制大于0。默认值是0。示例:"硬件断点": { "要求": true, "限制": 6 }输入:.

附加属性

进程ID

默认为${命令:选择流程}这将显示调试器可以附加到的可用进程列表。我们建议您保留默认设置,但可以显式设置为特定的进程ID,以便调试器附加到。

请求

指示该配置部分是否旨在发射程序或附加连接到已运行的实例。

目标架构

已弃用此选项不再需要,因为目标架构会自动检测。

类型

指示正在使用的底层调试器。必须是cppvsdbg当使用Visual Studio Windows调试器时,和cppdbg当使用GDB或LLDB时。当程序启动时,这个值会自动设置为正确的值。 launch.json文件已创建。

源文件映射

这允许将编译时的源路径映射到本地源位置。它是一个键/值对对象,并将解析第一个字符串匹配的路径。(示例:"sourceFileMap": { "/mnt/c": "c:\\" }将映射调试器返回的任何以开始的路径/mnt/c并将其转换为c:\\您可以在对象中拥有多个映射,但它们将按照提供的顺序处理。

环境变量定义文件

环境变量定义文件是一个包含键值对的简单文本文件,形式为环境变量=值,具有#用于注释。不支持多行值。

cppvsdbg调试器配置还包含一个环境文件允许您轻松设置变量以进行调试的属性。

例如:

项目环境文件:

# 项目环境

# 示例环境,键为 'MYENVRIONMENTPATH',值为 C:\\Users\\USERNAME\\Project
MYENVRIONMENTPATH=C:\\Users\\USERNAME\\Project

# 含有空格的变量
SPACED_OUT_PATH="C:\\这有空格\\项目"

符号选项

符号选项元素允许自定义调试器如何搜索符号。示例:

    "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的路径。

搜索Microsoft符号服务器:如果添加Microsoft Symbol服务器 (https://msdl.microsoft.com/download/symbols) 到符号搜索路径。如果未指定,此选项默认为输入:.

cachePath": 符号从符号服务器下载后应缓存的目录。如果未指定,调试器将默认为%TEMP%\SymbolCache..

moduleFilter.mode:这个值要么是"加载所有但排除的""仅加载包含的""加载所有但排除的"模式下,调试器会为所有模块加载符号,除非该模块在‘excludedModules’数组中。在"仅加载包含的"在模式下,除非该模块在'includedModules'数组中,或者通过'includeSymbolsNextToModules'设置包含,调试器将不会尝试加载任何模块的符号。

属性为"加载所有但排除的"模式

moduleFilter.excludedModules:调试器不应加载符号的模块数组。支持通配符(例如:MyCompany.*.dll)。

属性为"仅加载包含的"模式

moduleFilter.includedModules: 调试器应加载符号的模块数组。支持通配符(例如:MyCompany.*.dll)。

moduleFilter.includeSymbolsNextToModules:如果为真,对于不在'includedModules'数组中的任何模块,调试器仍然会在模块本身和启动可执行文件旁边进行检查,但不会检查符号搜索路径。此选项默认为'true'。