【问题标题】:LLDB formatter summary provider and syntactic children for template smart pointer用于模板智能指针的 LLDB 格式化程序摘要提供程序和语法子项
【发布时间】:2019-12-27 19:59:19
【问题描述】:

我有一个自定义的智能指针模板类SP<T>,如下所示(简化):

template<class T> class SP
{
public:
    T* operator->() const { return obj; }
    operator T*() const { return obj; }
    // other small methods (constructors, getters, setters)
private:
    T* obj;
};

为了简化 Xcode 和 Android Studio 中的调试,我想为 SP&lt;T&gt; 类型编写一个自定义 LLDB 格式化程序 条目,它的行为应该与基础类型 T* 完全相同。

目前,我能做到的最好的是以下简单的摘要提供程序:

type summary add -w alf -s "${var.obj}" -x ^SP<.*>$

这已经是一个巨大的胜利,因为现在显示了所有类型对象的摘要。但是有两个限制:

  • 如果是obj==nullptr,则摘要完全错误,因为在取消引用之前没有检查指针有效性。
  • 对于支持语法子代的T 类型,例如数组,我希望SP&lt;T&gt; 也有语法子代(但前提是obj!=nullptr)。

我知道用 Python 语言编写的摘要提供程序函数和语法子类。我忽略的是如何将摘要或语法子提供者转发到另一个具有可变基础类型的提供者。

【问题讨论】:

    标签: c++ xcode lldb


    【解决方案1】:

    首先,摘要的“文本格式”没有逻辑,因此如果您想为 obj == nullptr 提供不同的摘要,则必须使用 Python 摘要提供程序。

    摘要是计算摘要表达式时出现的对象值的首选,这使摘要自动级联。 IE。如果你有:

    struct Foo
    {
      std::string some_str;
    };
    

    并将摘要设置为:

    (lldb) type summary add -s "${var.some_str}" Foo
    

    然后打印该类型的变量:

    (lldb) fr v my_foo
    (Foo) my_foo = "abcd"
    

    但是对于一个数组,摘要是“元素的数量”,实际上并不能访问子元素。要返回结构化值,您需要实际的子对象而不是平面摘要。

    通过将 -e 选项传递给“type summary add”,您可以让一个对象同时显示摘要和子项。然后,如果您想了解更多信息,可以在演示文稿中公开 obj 对象。

    无论 obj 具有什么类型,这都会起作用,因为就像摘要一样,当 SBValue 系统呈现 obj 时,无论它是顶级变量还是子变量(合成的或真实的),它使用相同的类型驱动摘要/综合子逻辑来决定显示什么。

    但我认为你真正想要的不是“告诉我这种类型的孩子是什么”,而是“用它的子对象替换这个对象”。这将使为 SP 呈现的顶级对象为 obj

    目前还没有办法使用 lldb 中的类型表示系统来做到这一点。它要么侧重于平面摘要,要么侧重于重新呈现某个值的子级。

    但这似乎是一个合理的操作 - 尽管比已经存在的那些不太常用。如果您有动力,请随时使用 http://bugs.llvm.org 提交 ER,或者自己动手实施(lldb 是一个开源项目!)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-07-22
      • 2020-12-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多