我有一个自定义C ++容器类型,并希望在Xcode Variable View中改变外观的方式。需要制作类似于NSArray
或std::vector
的方式。
到现在为止,只能将摘要字符串更改为输出容器大小,并且不知道如何在具有索引的树中安排容器的子项。默认视图输出容器ivars。
是否可以使用LLDB Python脚本在树中输出容器子项?
答案 0 :(得分:0)
是的,确实如此。
您正在寻找的功能称为“合成子代”,它实质上涉及将Python类绑定到您的数据类型。当需要出售子对象(容器中的元素)时,LLDB将继续询问您的类,而不是像现在这样信任调试信息。 略有不同[1]这与LLDB对NSArray,std :: vector和其他几个人所做的事情相同
[1]众所周知的系统类型的合成子提供程序是用C ++编写的,并且是LLDB核心的一部分,主要是出于性能原因
为了自己动手,你需要实现一个遵守这个规范的类:
class SyntheticChildrenProvider:
def __init__(self, valobj, internal_dict):
this call should initialize the Python object using valobj as the variable to provide synthetic children for
def num_children(self):
this call should return the number of children that you want your object to have
def get_child_index(self,name):
this call should return the index of the synthetic child whose name is given as argument
def get_child_at_index(self,index):
this call should return a new LLDB SBValue object representing the child at the index given as argument
def update(self):
this call should be used to update the internal state of this Python object whenever the state of the variables in LLDB changes.[1]
def has_children(self):
this call should return True if this object might have children, and False if this object can be guaranteed not to have children.[2]
[1]此方法是可选的。此外,它可以选择返回一个值(从SVN rev153061 / LLDB-134开始)。如果它返回一个值,并且该值为True,则允许LLDB缓存子级并且子级计数它先前获得的值,并且不会返回提供者类来询问。如果没有返回任何内容,None或其他任何内容,LLDB将丢弃缓存的信息并询问。无论何时,只要有必要,LLDB都会调用更新。 [2]此方法是可选的(从SVN rev166495 / LLDB-175开始)。虽然以num_children的形式实现它是可以接受的,但鼓励实现者在合理的情况下寻找优化的编码备选方案。
详细信息位于http://lldb.llvm.org/varformats.html,包括指向可用作起点的几个示例实现的链接。
如果您有任何其他问题或需要更多指导,请随时回电!