【问题标题】:Display a C++ class member in LLDB type summary在 LLDB 类型摘要中显示 C++ 类成员
【发布时间】:2016-02-13 15:21:55
【问题描述】:

我有一个带有 static 成员的 C++ 类,表示类成员。我想使用自定义 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 似乎也无法获取类成员。

有没有办法在自定义 LLDB 类型摘要中显示类成员值,是通过 Python 还是直接?

【问题讨论】:

标签: c++ xcode lldb


【解决方案1】:

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

摘要的简单字符串格式没有“全局变量命名”的语法,因此您无法以这种方式添加它。因此,您将不得不编写基于 Python 的摘要。

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

【讨论】:

  • 很好的线索。这并不能完全解决我的问题,因为实际上我的类是一个支持单位的template,并且每个template 实例化的静态成员(单位SI 名称,如“m/s”)都不同。我会看看如何获​​取对象的完整类名。
  • 你的 python 总结得到一个代表要总结的值的 SBValue。 SBValue 有一个 GetTypeName,但您可能希望使用 GetType 获取类型,如果它是指针/引用并获取指针类型,然后获取它的名称。手动从类型名中去除这些字符很容易出错。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-09-30
  • 2013-06-18
  • 2014-07-12
  • 1970-01-01
  • 2011-01-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多