gcc - LLDB 不打印使用 gcc/g++ 编译的代码上的 std::vector 内容

标签 gcc gdb clang lldb

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

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

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

最佳答案

正如您从原始打印中看到的那样,std::vector 的 native 布局不是很有帮助,调试器需要处理数据以使其更加用户友好。 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++ 内容才能看到完整列表。

关于gcc - LLDB 不打印使用 gcc/g++ 编译的代码上的 std::vector 内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67980745/

相关文章:

c++ - 限制成员函数的限定符(限制此指针)

c - 这个 GCC 错误 "... relocation truncated to fit..."是什么意思?

c++ - 报告对象正在使用堆栈/堆上的多少内存? (广发局)

php - 如何使用 gdb 在 php 脚本中设置断点

c++ - 为什么 "#define WC(p) L#p"在 GCC 和 Clang 中不起作用?

c++ - 区分头文件和编译器/语言标准/os/glibc

c++ - 访问 map<int,string[4]> 中的元素

gcc - 为什么 gcc -Og 不生成源代码行映射?

c++ - 为什么 clang++ 无法在 Mavericks 下的 Mac 上编译,除了 sudo?

在没有编译器生成序言/结尾和 RET 指令的情况下创建 C 函数?