如何使用SBSyntheticValueProvider编写合成值数据格式化程序

时间:2016-05-18 12:24:41

标签: python xcode debugging lldb

我有一个简单的模板化C ++类storage_for<T>,它基本上在原始字符数组中存储类型为T的值。我想实现一个lldb数据格式化程序,它将字符数组转换为类型T并仅显示T的成员。所以假设我有一个变量storage_for<std::pair<int, int>> s;,那么Xcode变量列表应该显示节点

s (storage_for<std::pair<int, int>>)
   first = ...
   secon = ...

没有显示类型storage_for的内部结构而没有引入假子元素。 From reading the documentation我认为以下内容应该有效:

class storage_for_synth(lldb.SBSyntheticValueProvider): 
    def __init__(self, valobj, internal_dict):
        self.valobj = valobj

    def get_value(self):
        return self.valobj.GetChildMemberWithName('m_buffer').GetChildMemberWithName('__lx').Cast(self.valobj.GetType().GetTemplateArgumentType(0))

但事实并非如此。 get_value本身的表达是正确的。但是,对于我的类型的变量,Xcode变量列表和lldb控制台都没有显示任何内容。

1 个答案:

答案 0 :(得分:0)

这听起来像是正确的行为

get_value旨在为您的类型变量返回一个值,例如如果你有

class Int {
  private: int m_value;
};

您可以使用get_value使您的Int类具有与其基础整数表示相同的值

在您的情况下,听起来您正在尝试使SBValue具有与聚合类型(您的底层T)相同的值。聚合类型(即类)没有与int具有值的方式相同的值(这是设计 - 这些类型具有子值)

因此,LLDB将解释您的指示,因为类型的值是一个没有价值的变量

您需要做的是在提供商中销售子值,并将其作为基础T的子值出售

在那个注释中,让我快速警告你,使用SBValue :: Cast()进行非指向指针的转换偶尔会做不正确的事(这是一个已知的问题) - 我鼓励你施放m_buffer从char *到T *,如果有的话