在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++ Launch 配置中,将其值设置为包含内存转储路径的字符串。这甚至适用于在 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)
调试环境,您可以通过调试控制台直接执行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++扩展日志。
已知限制
符号和代码导航
所有平台:
- 因为扩展不解析函数体,Peek Definition 和 Go to Definition 对函数体内定义的符号不起作用。
调试
Windows:
- 在Cygwin和MinGW上的GDB无法中断正在运行的进程。要在应用程序运行时(不是在调试器下停止)设置断点,或者暂停正在调试的应用程序,请在应用程序的终端中按Ctrl-C。
- 在Cygwin上的GDB无法打开核心转储文件。
Linux:
- You may see an error saying:
ptrace: Operation not permitted
. This is due to GDB needing elevated permissions in order to attach to a process. This can be solved using the solutions below:-
使用附加到进程时,您需要在调试会话开始之前提供密码。
-
要暂时禁用此错误,请使用以下命令:
echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope
-
要永久移除错误,请添加一个名为
10-ptrace.conf
的文件到/etc/sysctl.d/
目录,并添加以下内容kernel.yama.ptrace_scope = 0
。
-
macOS:
- LLDB:
- 使用LLDB进行调试时,如果在断点模式下关闭终端窗口,调试不会停止。可以通过按下停止按钮来停止调试。
- 调试停止时,终端窗口不会关闭。
- GDB:
- 在macOS上使用GDB需要额外的手动安装步骤。请参阅README中的OS X的GDB手动安装。
- 当使用GDB附加到进程时,被调试的应用程序不能被中断。GDB只会绑定在应用程序未运行时设置的断点(无论是在附加到应用程序之前,还是在应用程序处于停止状态时)。这是由于GDB中的一个错误。
- 在使用GDB调试时无法加载核心转储,因为GDB不支持macOS中使用的核心转储格式。
- 当使用GDB附加到进程时,break-all将结束该进程。
下一步
继续阅读以了解以下内容:
- 为Windows子系统Linux配置VS Code
- 为Mingw-w64和GCC配置VS Code
- 为macOS配置VS Code
- 配置 C/C++ 调试 - 了解其他调试器配置选项。
- Basic Editing - 了解强大的Visual Studio Code编辑器。
- Code Navigation - 快速浏览您的源代码。
- Tasks - 使用任务来构建您的项目及更多。
- Debugging - 了解 Visual Studio Code 调试器。
如果您有任何其他问题或遇到任何问题,请在GitHub上提交问题。