在LLDB类型摘要中显示C++类成员

Display a C++ class member in LLDB type summary

本文关键字:显示 C++ 成员 LLDB 类型      更新时间:2023-10-16

我有一个C++类,它有一个static成员,意思是类成员。我想使用自定义LLDB类型摘要显示该类成员的值,以便于使用Xcode进行调试。选择一个非常简单的课程进行演示:

class A
{
public:
    int memberValue;
    static int classValue;
};
int A::classValue;
int main()
{
    A a;
    a.memberValue = 8;
    a.classValue = 42;
    return 0;
}

return语句上放置一个断点,运行该示例,我在LLDB命令窗口中得到以下结果:

(lldb) print a
(A) $0 = (memberValue = 8)
(lldb) print a.memberValue
(int) $1 = 8
(lldb) print a.classValue
(int) $2 = 42
(lldb) type summary add -s "${var.memberValue}" A
(lldb) print a
(A) $3 = 8
(lldb) type summary add -s "${var.classValue}" A
(lldb) print a
(A) $4 = error: summary string parsing error
(lldb) 

语法${var.classValue}不适用于类型摘要中的类成员,因为它适用于常规成员,尽管LLDB能够使用print命令显示值。

我尝试使用Python摘要提供程序,但没有成功:GetChildMemberWithName似乎也无法获取类成员。

有没有任何方法可以通过Python或直接在自定义LLDB类型摘要中显示类成员值?

Don是对的,lldb认为类的静态成员是静态变量,而不是类对象的子级。

摘要的简单字符串格式没有"全局变量命名"的语法,因此您无法以这种方式添加它。因此,您必须编写一个基于Python的摘要。

如果您这样做,那么应该直接进入类静态。您几乎做到了,只需要将变量作为静态变量获取,而不是作为对象的子变量。Python摘要在对象的SBValue中传递,您可以使用SBValue.GetTarget()获取拥有该值的目标,然后使用SBTarget.FindFirstGlobalVariable查找类static的值。在您的情况下,变量的名称应该是A::classValue