【发布时间】:2021-05-19 09:22:16
【问题描述】:
有人知道,为什么 lldb 漂亮的打印机不适用于 MacOS 上的 GNU GCC 编译程序吗?
我有一个简单的 C++ 程序,我使用 GCC 10.2(来自 Homebrew)编译,并带有以下 CXX_FLAGS:--std=c++17 -g -O0
#include <vector>
int main() {
std::vector<int> v = {1, 2, 3};
std::cout << v[0];
return 0;
}
当我尝试检查变量 v 时,我得到以下结果:
(vector<int, allocator<int> >) $0 = {
_Vector_base<int, allocator<int> > = {
_M_impl = {
_Vector_base<int, allocator<int> >::_Vector_impl_data = {
_M_start = 0x00000001005062a0
_M_finish = 0x00000001005062ac
_M_end_of_storage = 0x00000001005062ac
}
}
}
}
vector 之前没有 std:: 前缀,因此没有为该类型添加漂亮的打印机(默认情况下它处理 "^(std::__1::)vector<.+>$")。
AFAIU,默认情况下,LLDB 中的漂亮打印机为libc++ 启用,而 GCC 使用libstdc++。
有人知道,如何解决这个问题并让漂亮的打印机为 LLDB 中的 GNU GCC 编译程序工作?
【问题讨论】:
-
如果确实有类型名未包装在 std:: 命名空间中的 std 类,那么内置格式化程序将不匹配。无法使用新的匹配标准重新添加内置格式化程序,因此您必须构建自己的 lldb 并调整匹配模式。我在这里要问的问题是谁在 std 命名空间之外提供 std 类,你能让他们停止这样做吗?
-
Homebrew 的 GCC 二进制文件通过帖子中的 CXX_FLAGS 给了我上面的结果。它需要在代码中使用
std命名空间,但由于某种原因,std在使用lldb的调试过程中没有作为前缀显示 -
顺便说一句,我刚刚尝试使用
-gdwarf-3选项,它解决了我的问题。