我有一个简单的模板化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控制台都没有显示任何内容。
答案 0 :(得分:0)
这听起来像是正确的行为
get_value
旨在为您的类型变量返回一个值,例如如果你有
class Int {
private: int m_value;
};
您可以使用get_value
使您的Int类具有与其基础整数表示相同的值
在您的情况下,听起来您正在尝试使SBValue具有与聚合类型(您的底层T)相同的值。聚合类型(即类)没有与int具有值的方式相同的值(这是设计 - 这些类型具有子值)
因此,LLDB将解释您的指示,因为类型的值是一个没有价值的变量
您需要做的是在提供商中销售子值,并将其作为基础T的子值出售
在那个注释中,让我快速警告你,使用SBValue :: Cast()进行非指向指针的转换偶尔会做不正确的事(这是一个已知的问题) - 我鼓励你施放m_buffer从char *到T *,如果有的话