gpt4 book ai didi

c++ - 模板智能指针的 LLDB 格式化程序摘要提供程序和句法子项

转载 作者:太空狗 更新时间:2023-10-29 22:54:04 24 4
gpt4 key购买 nike

我有一个自定义的智能指针模板类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<T> 编写自定义 LLDB 格式化程序 条目它的行为应该与底层类型完全相同 T* .

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

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

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

  • 如果obj==nullptr , 总结是完全错误的,因为在取消引用之前没有检查指针的有效性。
  • 对于 T支持语法子项的类型,例如数组,我希望 SP<T>也有句法 child (但前提是 obj!=nullptr )。

我了解用 Python 语言编写的摘要提供程序函数和句法子类。我忽略的是如何转发一个摘要或句法子提供程序到另一个具有可 rebase 础类型的提供程序。

最佳答案

首先,摘要的“文本格式”没有逻辑,所以如果您想为 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 时,无论它是顶级变量还是子变量(合成或真实),它使用相同的类型驱动摘要/综合子逻辑来决定显示什么。

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

现在没有办法用 lldb 中的类型表示系统来做到这一点。它侧重于简单的摘要或重新呈现值的子项。

但这似乎是一个合理的操作 - 尽管不如已经存在的那样普遍使用。欢迎使用 http://bugs.llvm.org 提交 ER ,或者尝试一下自己实现它(lldb 是一个开源项目!),如果你觉得很有动力的话。

关于c++ - 模板智能指针的 LLDB 格式化程序摘要提供程序和句法子项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57610265/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com