【问题标题】:LLDB not printing contents of std::vector on code compiled with gcc/g++LLDB 不在使用 gcc/g++ 编译的代码上打印 std::vector 的内容
【发布时间】:2021-08-30 23:30:07
【问题描述】:

我正在尝试在我的 Mac 上使用带有 VScode 的调试器。由于某种原因,即使在代码签名之后 gdb 也无法工作。它以错误 134 退出。但是,它似乎在命令行上工作正常。 VScode 可以与 lldb 和 clang 编译器一起正常工作,并且可以正确显示 STL 容器的内容。

但是,出于某种原因,我需要使用 GCC 编译器。正如我已经说过的,GDB 不使用 VScode,所以我试图让 LLDB 工作。但是,LLDB 没有正确显示 stl 容器。当我使用“-g”标志编译时,lldb 根本无法正确显示 stl 容器的内容。它显示了容器的原始内容,没有任何漂亮的打印。当我使用“-gdwarf-3”或“-gdwarf-4”标志编译时,它能够正确显示字符串。但不是向量的内容。它只是说 size=0 的向量,并且在我将元素推入向量时不会更新。有什么方法/解决方案可以让任何调试器(lldb/gdb)正常工作,并通过漂亮的打印来调试使用 gcc 编译器编译的文件。

我尝试过 gcc 版本 11 和 9,以及 gdb 版本 8 和 10,但均未成功。

【问题讨论】:

    标签: gcc gdb clang lldb


    【解决方案1】:

    正如您从原始打印中看到的,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++ 内容才能看到完整列表。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-06
      • 2020-07-15
      • 2016-05-21
      • 2021-05-19
      • 1970-01-01
      相关资源
      最近更新 更多