我正在尝试在 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/