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

在 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 配置中手动设置调试器路径。launch.json). 要调试您的Cygwin或MinGW应用程序,请添加miDebuggerPath属性并将其值设置为您的Cygwin或MinGW环境的相应gdb.exe的位置。

例如:

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

在Windows上使用Cygwin/MinGW进行调试支持附加和启动调试场景。

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

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

条件断点

条件断点使您能够在特定代码行的条件为真时暂停执行。要设置条件断点,请右键单击现有断点并选择编辑断点。这将打开一个小Windows,您可以在其中输入在调试期间断点必须评估为真的条件。

条件中断

在编辑器中,条件断点由一个内部带有黑色等号的断点符号表示。将光标悬停在条件断点上可以显示其条件。

函数断点

函数断点允许您在函数开始处中断执行,而不是在特定的代码行上。要设置函数断点,请在运行视图中,右键单击断点部分,然后选择添加函数断点并输入您希望中断执行的函数名称。

表达式评估

VS Code 在多个上下文中支持表达式评估:

  • 您可以在观察部分的运行视图中输入一个表达式,并且每次达到断点时都会对该表达式进行评估。
  • 您可以将表达式输入调试控制台,它将只被评估一次。
  • 当您在断点处暂停时,您可以评估代码中出现的任何表达式。

观察部分中的表达式会在正在调试的应用程序中生效;一个修改变量值的表达式将在此程序的运行期间修改该变量。

多线程调试

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

多线程进程

内存转储调试

VS Code 的 C/C++ 扩展还具有调试内存转储的能力。要调试内存转储,请打开你的launch.json文件并添加核心转储路径(适用于GDB或LLDB)或转储路径 (对于Visual Studio Windows调试器) 属性到C++ 启动 配置,将其值设置为包含内存转储路径的字符串。即使在64位机器上调试32位程序也是如此。

附加符号

如果还有其他目录调试器可以找到符号文件(例如,.pdbVisual Studio Windows Debugger 的文件,可以通过添加来指定附加的SOLib搜索路径(适用于GDB或LLDB)或符号搜索路径(适用于 Visual Studio Windows 调试器)。

例如:

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

    "symbolSearchPath": "C:\\路径\\\\符号;C:\\另一个\\路径\\\\符号"

定位源文件

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

例如:

"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命令-执行命令,但要小心,直接在调试控制台中执行命令在某些情况下未经测试,可能会导致 VS Code 崩溃。

其他调试功能

  • 无条件断点
  • 观看Windows
  • 调用栈
  • 迈步

有关在 VS Code 中调试的更多信息,请参阅此介绍 VS Code 调试

有关于配置 launch.json 文件以调试您的 C/C++ 应用程序的更多方法,请参见 配置 C/C++ 调试.

Natvis 框架

您可以通过 Natvis 框架在调试器中创建 C++ 对象的自定义视图。您可以阅读 原生对象的自定义视图 主题以了解在 C/C++ 扩展中使用 Natvis 的详细信息。

远程调试

有关附加到远程进程的信息,例如在Docker容器中调试进程,请参见Pipe transport.

调试调试器

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

已知限制

符号和代码导航

所有平台:

  • 由于扩展不解析函数体,Peek DefinitionGo to Definition无法用于在函数体内部定义的符号。

调试

Windows:

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

Linux:

  • 您可能会看到一个错误信息说:ptrace: 操作不被允许这是因为GDB需要提升权限才能附加到一个进程。这可以通过下面的解决方案来解决:
    1. 当使用附加到进程时,您需要在调试会话开始之前提供您的密码。

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

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

    3. 要永久性地消除错误,请添加一个名为的文件10-ptrace.conf/etc/sysctl.d/并添加以下内容内核.yama.ptrace_scope = 0输入:.

macOS:

  • LLDB:
    • 在使用LLDB调试时,如果在暂停模式下关闭终端Windows,调试不会停止。可以通过按停止按钮来停止调试。
    • 当调试停止时,终端Windows不会关闭。
  • GDB:
    • 在macOS上使用GDB需要额外的手动安装步骤。请参阅OS X上GDB的手动安装README中。
    • 在使用GDB附加到一个进程时,正在调试的应用程序无法中断。GDB只会绑定在应用程序未运行时(在附加到应用程序之前,或者应用程序处于停止状态时)设置的断点。这是由于GDB的一个错误
    • 在使用GDB进行调试时无法加载核心转储,因为GDB 不支持macOS中使用的核心转储格式.
    • 当附加到使用GDB的进程时,break-all将终止该进程。

下一步

继续阅读,了解:

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