在 macOS 上使用 Visual Studio 代码调试 C++ 标准库
Debug C++ Standard Library with Visual Studio Code on macOS
我在 macOS 上使用 Visual Studio Code 和 Microsoft C/C++ Extension 来评估生产环境中的真正可用性和生产力。
在我的场景中,我使用 Clang/LLVM 编译器和 LLDB 调试器。
由于某些未知原因,我无法调试 C++ 标准库。我可以进入我的应用程序中定义的符号,但无法对标准符号执行相同的操作,例如std::vector
构造函数。
不清楚这是配置不正确还是这些工具的限制。在网上搜索我注意到 C++ 标准库调试在使用 GNU 工具链的 Linux 上确实运行良好。
有没有办法使用 LLDB 调试器来调试标准符号?有人在生产中使用这些工具吗?
为了完整起见,它遵循我当前的非常简单的配置:
tasks.json
:
{
"version": "2.0.0",
"tasks": [
{
"type": "cppbuild",
"label": "C/C++: clang++ build active file",
"command": "/usr/bin/clang++",
"args": [
"-std=c++17",
"-stdlib=libc++",
"-g",
"${file}",
"-o",
"${fileDirname}/${fileBasenameNoExtension}"
],
"options": {
"cwd": "${workspaceFolder}"
},
"problemMatcher": [
"$gcc"
],
"group": {
"kind": "build",
"isDefault": true
},
"detail": "compiler: /usr/bin/clang++"
}
]
}
launch.json
:
{
"version": "0.2.0",
"configurations": [
{
"name": "(lldb) Launch",
"type": "cppdbg",
"request": "launch",
"program": "${fileDirname}/${fileBasenameNoExtension}",
"args": [],
"stopAtEntry": false,
"cwd": "${workspaceFolder}",
"environment": [],
"console": "externalTerminal",
"MIMode": "lldb",
"preLaunchTask": "${defaultBuildTask}"
}
]
}
微软C/C++扩展支持团队指出,这是由于lldb
的默认配置所致。事实上,target.process.thread.step-avoid-regexp
默认设置为^std::
:
(lldb) settings show target.process.thread.step-avoid-regexp
target.process.thread.step-avoid-regexp (regex) = ^std::
将此设置更改为 ""
,调试器也能够进入标准模板符号。这可以在 launch.json
配置文件中配置,方法是添加:
"setupCommands": [
{
"text": "settings set target.process.thread.step-avoid-regexp \"\"",
"description": "Enable stepping into STL"
}
]
或者,这也可以通过将此配置放在主目录的 .gdbinit
文件中来在用户级别进行设置:
settings set target.process.thread.step-avoid-regexp ""
我在 macOS 上使用 Visual Studio Code 和 Microsoft C/C++ Extension 来评估生产环境中的真正可用性和生产力。
在我的场景中,我使用 Clang/LLVM 编译器和 LLDB 调试器。
由于某些未知原因,我无法调试 C++ 标准库。我可以进入我的应用程序中定义的符号,但无法对标准符号执行相同的操作,例如std::vector
构造函数。
不清楚这是配置不正确还是这些工具的限制。在网上搜索我注意到 C++ 标准库调试在使用 GNU 工具链的 Linux 上确实运行良好。
有没有办法使用 LLDB 调试器来调试标准符号?有人在生产中使用这些工具吗?
为了完整起见,它遵循我当前的非常简单的配置:
tasks.json
:
{
"version": "2.0.0",
"tasks": [
{
"type": "cppbuild",
"label": "C/C++: clang++ build active file",
"command": "/usr/bin/clang++",
"args": [
"-std=c++17",
"-stdlib=libc++",
"-g",
"${file}",
"-o",
"${fileDirname}/${fileBasenameNoExtension}"
],
"options": {
"cwd": "${workspaceFolder}"
},
"problemMatcher": [
"$gcc"
],
"group": {
"kind": "build",
"isDefault": true
},
"detail": "compiler: /usr/bin/clang++"
}
]
}
launch.json
:
{
"version": "0.2.0",
"configurations": [
{
"name": "(lldb) Launch",
"type": "cppdbg",
"request": "launch",
"program": "${fileDirname}/${fileBasenameNoExtension}",
"args": [],
"stopAtEntry": false,
"cwd": "${workspaceFolder}",
"environment": [],
"console": "externalTerminal",
"MIMode": "lldb",
"preLaunchTask": "${defaultBuildTask}"
}
]
}
微软C/C++扩展支持团队指出,这是由于lldb
的默认配置所致。事实上,target.process.thread.step-avoid-regexp
默认设置为^std::
:
(lldb) settings show target.process.thread.step-avoid-regexp
target.process.thread.step-avoid-regexp (regex) = ^std::
将此设置更改为 ""
,调试器也能够进入标准模板符号。这可以在 launch.json
配置文件中配置,方法是添加:
"setupCommands": [
{
"text": "settings set target.process.thread.step-avoid-regexp \"\"",
"description": "Enable stepping into STL"
}
]
或者,这也可以通过将此配置放在主目录的 .gdbinit
文件中来在用户级别进行设置:
settings set target.process.thread.step-avoid-regexp ""