正如您从原始打印中看到的,std::vector 的本机布局不是很有帮助,调试器需要处理数据以使其更加用户友好。 lldb 使用“合成子提供者”来完成这项工作(更多关于这里的内容:https://lldb.llvm.org/use/variable.html#synthetic-children)。
由于 GNU 和 clang STL 实现的内部细节,它们需要自己独立的合成子提供程序。
lldb 为 clang STL 实现提供了一套相当完整的内置数据格式化程序。它还有一小组 gnu libstdc++ 格式化程序,在源代码中:
https://github.com/llvm/llvm-project/blob/main/lldb/examples/synthetic/gnu_libstdcpp.py
它们还附带 LLDB 发行版(在 macOS 上的 LLDB.framework/Resources/Python/lldb/formatters/cpp 中)并且应该由 lldb 注册。那里有一个 std::vectors 。格式化程序由类型匹配分配。
您可以通过以下方式判断给定变量是否与合成提供者匹配:
(lldb) type synthetic info myVec
synthetic applied to (std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >) myVec is: libc++ std::vector synthetic children
这是 libc++ std::vector 的输出。您应该会看到 GUN std::vector 的类似内容,它使用类型匹配表达式注册:
^std::vector<.+>(( )?&)?$: Python class lldb.formatters.cpp.gnu_libstdcpp.StdVectorSynthProvider
(这是type synthetic list 的输出)。第一个元素是类型的匹配模式。您可能会检查 std::vector 类的实际解构名称是什么,也许某些东西正在更改名称,以便我们不再匹配它?
关于type synthetic list 的一个警告是,类型格式化程序列表是惰性构建的,因此您必须尝试打印 C++ 内容才能看到完整列表。