在 Visual Studio Code 中调试 C++

按照每个目标编译器/平台的配置教程中指定的方式设置调试环境的基础知识后,您可以在本节中了解有关调试 C/C++ 的更多详细信息。

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

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

使用 GDB 进行 Windows 调试

您可以使用 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 进行调试,请参阅使用 MinGW64 进行 Windows 调试

条件断点

条件断点使您能够仅在条件值为 true 时中断特定代码行的执行。要设置条件断点,请右键单击现有断点并选择“编辑断点”。这将打开一个小查看窗口,您可以在其中输入必须计算为 true 的条件,以便在调试期间命中断点。

有条件休息

在编辑器中,条件断点由内部有黑色等号的断点符号指示。您可以将光标放在条件断点上以显示其条件。

函数断点

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

表达评估

VS Code 支持多种上下文中的表达式求值:

  • 您可以在“运行”视图的“监视”部分中键入一个表达式,每次命中断点时都会对其进行计算。
  • 您可以在调试控制台中输入一个表达式,它只会被计算一次。
  • 当您停在断点处时,您可以计算代码中出现的任何表达式。

Watch部分中的表达式在被调试的应用程序中生效;修改变量值的表达式将在程序运行期间修改该变量。

多线程调试

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

多线程进程

内存转储调试

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

附加符号

如果调试器可以在其他目录中找到符号文件(例如,.pdbVisual Studio Windows 调试器的文件),则可以通过添加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)调试环境,您可以使用命令直接通过调试控制台执行 GDB、LLDB 和 LLDB-MI 命令-exec,但要注意,直接在调试控制台中执行命令未经测试,在某些情况下可能会导致 VS Code 崩溃。

其他调试功能

  • 无条件断点
  • 观察窗
  • 调用栈
  • 踏步

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

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

Natvis框架

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

远程调试

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

调试调试器

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

已知的限制

符号和代码导航

所有平台:

  • 由于扩展不解析函数体,因此“查看定义”“转到定义”不适用于函数体内定义的符号。

调试

视窗:

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

Linux:

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

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

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

    3. 要永久消除错误,请添加一个名为10-ptrace.confto的文件/etc/sysctl.d/并添加以下kernel.yama.ptrace_scope = 0.

苹果系统:

  • LLDB:
    • 使用 LLDB 进行调试时,如果在中断模式下关闭终端窗口,则调试不会停止。按“停止”按钮可以停止调试。
    • 当调试停止时,终端窗口不会关闭。
  • 广东发展局:
    • 要在 macOS 上使用 GDB,需要执行额外的手动安装步骤。请参阅README中的手动安装适用于 OS X 的 GDB
    • 当使用 GDB 连接到进程时,正在调试的应用程序不能被中断。GDB 将仅绑定在应用程序未运行时设置的断点(在附加到应用程序之前,或在应用程序处于停止状态时)。这是由于GDB 中的错误造成的。
    • 使用 GDB 调试时无法加载核心转储,因为 GDB不支持 macOS 中使用的核心转储格式
    • 当使用 GDB 连接到进程时,break-all 将结束该进程。

下一步

继续阅读以了解:

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