现已推出!阅读 10 月份的更新内容,了解新功能和修复。

在 Visual Studio Code 中调试 C++

在为每个目标编译器/平台设置调试环境的基础知识之后,您可以在本节中了解有关 C/C++ 调试的更多详细信息。

Visual Studio Code 支持以下 C/C++ 调试器,具体取决于您使用的操作系统

  • Linux:GDB
  • macOS:LLDB 或 GDB
  • Windows:Visual Studio Windows 调试器或 GDB(使用 Cygwin 或 MinGW)

Windows 上使用 GDB 调试

您可以使用 VS Code 调试使用 Cygwin 或 MinGW 创建的 Windows 应用程序。若要使用 Cygwin 或 MinGW 调试功能,必须在启动配置(launch.json)中手动设置调试器路径。若要调试 Cygwin 或 MinGW 应用程序,请添加 miDebuggerPath 属性,并将其值设置为 Cygwin 或 MinGW 环境中相应 gdb.exe 的位置。

例如

    "miDebuggerPath": "c:\\mingw\\bin\\gdb.exe"

Windows 上的 Cygwin/MinGW 调试支持附加和启动调试场景。

要了解更多信息,请参阅 配置 C/C++ 调试

如果您在 Windows 上使用 GDB 调试,请参阅 Windows 上使用 MinGW64 进行调试

条件断点

条件断点使您能够仅在条件的值为真时才在代码的特定行上中断执行。若要设置条件断点,请右键单击现有断点,然后选择编辑断点。这将打开一个小型的窥视窗口,您可以在其中输入必须求值为真才能在调试期间命中该断点的条件。

A conditional break

在编辑器中,条件断点用一个断点符号表示,该符号内部有一个黑色等号。您可以将光标置于条件断点上以显示其条件。

函数断点

函数断点使您能够在函数的开头中断执行,而不是在代码的特定行上。若要设置函数断点,请在运行视图中,右键单击断点部分内的任何位置,然后选择添加函数断点,并输入要中断执行的函数的名称。

表达式求值

VS Code 支持在以下几种情况下进行表达式求值

  • 您可以在运行视图的监视部分中键入表达式,它将在每次命中断点时求值。
  • 您可以在调试控制台中键入表达式,它将仅求值一次。
  • 当您在断点处停止时,您可以对代码中出现的任何表达式求值。

监视部分中的表达式将在正在调试的应用程序中生效;修改变量值的表达式将修改该变量,直到程序结束。

多线程调试

VS Code 的 C/C++ 扩展能够调试多线程程序。所有线程及其调用堆栈都将显示在调用堆栈部分中

Multi-threaded process

内存转储调试

VS Code 的 C/C++ 扩展还能够调试内存转储。若要调试内存转储,请打开您的 launch.json 文件,并将 coreDumpPath(对于 GDB 或 LLDB)或 dumpPath(对于 Visual Studio Windows 调试器)属性添加到C++ 启动配置,并将该属性的值设置为包含内存转储路径的字符串。这甚至适用于在 x64 机器上调试的 x86 程序。

其他符号

如果调试器可以找到符号文件(例如,Visual Studio Windows 调试器的 .pdb 文件)的其他目录,则可以通过添加 additionalSOLibSearchPath(对于 GDB 或 LLDB)或 symbolSearchPath(对于 Visual Studio Windows 调试器)来指定这些目录。

例如

    "additionalSOLibSearchPath": "/path/to/symbols;/another/path/to/symbols"

    "symbolSearchPath": "C:\\path\\to\\symbols;C:\\another\\path\\to\\symbols"

查找源文件

如果源文件未位于编译位置,则可以更改源文件位置。这可以通过在 sourceFileMap 部分中添加简单的替换对来完成。此列表中的第一个匹配项将被使用。

例如

"sourceFileMap": {
    "/build/gcc-4.8-fNUjSI/gcc-4.8-4.8.4/build/i686-linux-gnu/libstdc++-v3/include/i686-linux-gnu": "/usr/include/i686-linux-gnu/c++/4.8",
    "/build/gcc-4.8-fNUjSI/gcc-4.8-4.8.4/build/i686-linux-gnu/libstdc++-v3/include": "/usr/include/c++/4.8"
}

GDB、LLDB 和 LLDB-MI 命令 (GDB/LLDB)

对于 C++ (GDB/LLDB) 调试环境,您可以使用 -exec 命令直接通过调试控制台执行 GDB、LLDB 和 LLDB-MI 命令,但请谨慎操作,因为直接在调试控制台中执行命令未经测试,在某些情况下可能会导致 VS Code 崩溃。

其他调试功能

  • 无条件断点
  • 监视窗口
  • 调用堆栈
  • 单步执行

有关使用 VS Code 进行调试的更多信息,请参阅此 VS Code 中调试 简介。

若要了解有关配置 launch.json 文件的其他方法,以便您调试 C/C++ 应用程序,请参阅 配置 C/C++ 调试

Natvis 框架

您可以使用 Natvis 框架在调试器中创建 C++ 对象的自定义视图。您可以阅读 本机对象的自定义视图 主题,了解有关将 Natvis 与 C/C++ 扩展一起使用的详细信息。

远程调试

有关附加到远程进程(例如调试 Docker 容器中的进程)的信息,请参阅 管道传输

调试调试器

如果您在使用扩展进行调试时遇到我们无法根据您在问题报告中提供的信息进行诊断的调试问题,我们可能会要求您启用日志记录并向我们发送日志。请参阅 为调试适配器启用日志记录,了解如何获取 C/C++ 扩展日志。

已知限制

符号和代码导航

所有平台

  • 由于扩展不解析函数体,因此查看定义转到定义对于在函数体内定义的符号不起作用。

调试

Windows

  • Cygwin 和 MinGW 上的 GDB 无法中断正在运行的进程。若要在应用程序正在运行时设置断点(未在调试器下停止),或暂停正在调试的应用程序,请在应用程序的终端中按 Ctrl-C
  • Cygwin 上的 GDB 无法打开核心转储。

Linux

  • 您可能会看到以下错误:ptrace: Operation not permitted。这是因为 GDB 需要提升的权限才能附加到进程。可以使用以下解决方案解决此问题
    1. 使用附加到进程时,您需要提供密码才能开始调试会话。

    2. 若要暂时禁用此错误,请使用以下命令

      echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope

    3. 若要永久删除此错误,请在 /etc/sysctl.d/ 中添加一个名为 10-ptrace.conf 的文件,并添加以下内容 kernel.yama.ptrace_scope = 0

macOS

  • LLDB
    • 使用 LLDB 进行调试时,如果在断点模式下关闭了终端窗口,调试不会停止。可以通过按停止按钮停止调试。
    • 调试停止后,终端窗口不会关闭。
  • GDB
    • 在 macOS 上使用 GDB 需要额外的手动安装步骤。请参阅 自述文件 中的OS X 上的 GDB 手动安装
    • 使用 GDB 附加到进程时,无法中断正在调试的应用程序。GDB 仅绑定在应用程序未运行时设置的断点(在附加到应用程序之前,或应用程序处于停止状态时)。这是由于 GDB 中的一个错误
    • 使用 GDB 进行调试时,无法加载核心转储,因为 GDB 不支持 macOS 中使用的核心转储格式
    • 使用 GDB 附加到进程时,断点所有将结束进程。

后续步骤

继续阅读以了解有关

如果您有任何其他问题或遇到任何问题,请在 GitHub 上提交问题。