在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”。

条件断点

条件断点允许你只有在条件值为真时才能破坏特定代码行的执行。要设置条件断点,右键点击已有断点并选择编辑断点。这会打开一个小的窥视窗口,你可以输入必须计算为真以保证在调试时达到断点的条件。

有条件断裂

在编辑器中,条件断点通过一个断点符号表示,断点内含黑色等号。你可以将光标放在条件断点上以显示其状态。

函数断点

函数断点允许你在函数开头切断执行,而不是在特定代码行中断。要设置函数断点,在运行视图中右键点击断部分,然后选择添加函数断点,输入你想中断执行的函数名称。

表达式评估

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 调试器的文件),它们可以通过添加附加SOLibSearchPath(额外SOLibSearchPath)(针对GDB或LLDB)或symbolSearchPath(适用于Visual Studio Windows调试器)。

例如:

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

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

查找源文件

如果源文件不在编译位置,则可以更改源文件的位置。这通过在来源FileMap分区。将使用列表中的第一个匹配。

例如:

"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。

其他调试功能

  • 无条件断点
  • 手表窗口
  • 呼叫堆栈
  • 步进

关于使用 VS Code 调试的更多信息,请参见这份《VS Code 调试介绍》。

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

Natvis 框架

你可以用Natvis框架在调试器中创建C++对象的自定义视图。你可以阅读“原生对象自定义视图”主题,了解如何使用带有C/C++扩展的Natvis。

远程调试

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

调试调试器

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

已知的局限性

符号与代码导航

所有站台:

  • 由于扩展不解析函数实体,窥视定义进入定义对于函数内部定义的符号不起作用。

调试

Windows:

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

Linux:

  • 你可能会看到一个错误提示:ptrace:不允许作.这是因为GDB需要提升权限才能连接到进程。此问题可用以下解法求解:
    1. 使用“插入进程”时,你需要在调试会话开始前提供密码。

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

      回声0 |sudo tee /proc/sys/kernel/yama/ptrace_scope

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

macOS:

  • LLDB:
    • 在使用LLDB调试时,如果终端窗口在中断模式下关闭,调试不会停止。可以通过按下停止按钮来停止调试。
    • 当调试停止时,终端窗口并未关闭。
  • GDB:
    • 在macOS上使用GDB还需要额外的手动安装步骤。详见 README 中的 OS X GDB 手动安装
    • 当通过GDB附加到进程时,被调试的应用程序无法被中断。GDB只会绑定应用程序未运行时设置的断点(无论是在附加应用之前,还是应用处于停止状态时)。这是由于GDB的一个bug
    • 在用 GDB 调试时无法加载核心转储,因为 GDB 不支持 macOS 中使用的核心转储格式
    • 当连接到GDB的进程时,断开将终止该进程。

下一步

继续阅读,了解:

如果你还有其他问题或遇到问题,请在GitHub提交问题。