【问题标题】:Why lldb pretty printers doesn't work for GNU GCC compiled program on MacOS?为什么 lldb 漂亮的打印机不适用于 MacOS 上的 GNU GCC 编译程序?
【发布时间】: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&lt;.+&gt;$")。 AFAIU,默认情况下,LLDB 中的漂亮打印机为libc++ 启用,而 GCC 使用libstdc++

有人知道,如何解决这个问题并让漂亮的打印机为 LLDB 中的 GNU GCC 编译程序工作?

【问题讨论】:

  • 如果确实有类型名未包装在 std:: 命名空间中的 std 类,那么内置格式化程序将不匹配。无法使用新的匹配标准重新添加内置格式化程序,因此您必须构建自己的 lldb 并调整匹配模式。我在这里要问的问题是谁在 std 命名空间之外提供 std 类,你能让他们停止这样做吗?
  • Homebrew 的 GCC 二进制文件通过帖子中的 CXX_FLAGS 给了我上面的结果。它需要在代码中使用std 命名空间,但由于某种原因,std 在使用lldb 的调试过程中没有作为前缀显示
  • 顺便说一句,我刚刚尝试使用-gdwarf-3 选项,它解决了我的问题。

标签: c++ debugging gcc lldb


【解决方案1】:

-gdwarf-3 选项解决了在调试过程中缺少std:: 前缀的原始问题,因此使用该标志漂亮的打印机可以正常工作。

附: -gdwarf-4 让漂亮的打印机也能正常工作

【讨论】:

    猜你喜欢
    • 2013-06-20
    • 2022-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-18
    • 2015-06-26
    • 1970-01-01
    • 2017-08-11
    相关资源
    最近更新 更多