在 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 程序。
附加符号
如果调试器可以在其他目录中找到符号文件(例如,.pdb
Visual 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 需要提升权限才能附加到进程。可以使用以下解决方案来解决此问题:-
使用Attach to process时,您需要在调试会话开始之前提供密码。
-
要暂时禁用此错误,请使用以下命令:
echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope
-
要永久消除错误,请添加一个名为
10-ptrace.conf
to的文件/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 将结束该进程。
下一步
继续阅读以了解:
- 为 Linux 的 Windows 子系统配置 VS Code
- 为 Mingw-w64 和 GCC 配置 VS Code
- 为 macOS 配置 VS Code
- 配置 C/C++ 调试- 了解其他调试器配置选项。
- 基本编辑- 了解强大的 Visual Studio Code 编辑器。
- 代码导航- 快速浏览源代码。
- 任务- 使用任务来构建您的项目等。
- 调试- 了解 Visual Studio Code 调试器。