在 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 在多种上下文中支持表达式评估
- 您可以在运行视图的监视部分中键入表达式,每次命中断点时都会对其进行评估。
- 您可以在调试控制台中键入表达式,并且只会对其进行一次评估。
- 在您停止在断点处时,可以评估代码中出现的任何表达式。
监视部分中的表达式在正在调试的应用中生效;修改变量值的表达式将在程序的整个持续时间内修改该变量。
多线程调试
VS Code 的 C/C++ 扩展具有调试多线程程序的功能。所有线程及其调用堆栈都显示在调用堆栈部分
内存转储调试
VS Code 的 C/C++ 扩展还具有调试内存转储的功能。要调试内存转储,请打开您的 launch.json
文件,并在 C++ Launch 配置中添加 coreDumpPath
(适用于 GDB 或 LLDB) 或 dumpPath
(适用于 Visual Studio Windows 调试器) 属性,将其值设置为包含内存转储路径的字符串。即使在 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 需要提升权限才能附加到进程。可以使用以下解决方案解决此问题-
使用附加到进程时,您需要在调试会话开始前提供密码。
-
要暂时禁用此错误,请使用以下命令
echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope
-
要永久消除此错误,请在
/etc/sysctl.d/
中添加一个名为10-ptrace.conf
的文件,并添加以下内容kernel.yama.ptrace_scope = 0
。
-
macOS
- LLDB
- 使用 LLDB 调试时,如果在中断模式下关闭终端窗口,调试不会停止。可以通过按停止按钮来停止调试。
- 调试停止时,终端窗口不会关闭。
- GDB
- 在 macOS 上使用 GDB 需要额外的手动安装步骤。请参阅README中的OS X 版 GDB 手动安装。
- 使用 GDB 附加到进程时,正在调试的应用无法中断。GDB 只会绑定在应用未运行时(附加到应用之前或应用处于停止状态时)设置的断点。这是由于GDB 中的一个 bug。
- 使用 GDB 调试时无法加载核心转储,因为 GDB 不支持 macOS 中使用的核心转储格式。
- 使用 GDB 附加到进程时,break-all 将结束进程。
下一步
继续阅读了解
- 为适用于 Linux 的 Windows 子系统配置 VS Code
- 为 Mingw-w64 和 GCC 配置 VS Code
- 为 macOS 配置 VS Code
- 配置 C/C++ 调试 - 了解更多调试器配置选项。
- 基本编辑 - 了解强大的 Visual Studio Code 编辑器。
- 代码导航 - 快速浏览您的源代码。
- 任务 - 使用任务构建您的项目等等。
- 调试 - 了解 Visual Studio Code 调试器。
如果您有其他问题或遇到任何问题,请在GitHub上提交议题。