自定义chisel命令
1,chisel自带的命令就很强大,但是还无法满足某些特殊的需求,如打印内容,显示格式,这就需要我们对chisel命令进行自定义了。基本使用可以看这篇文章
2,本文写的小例子是打印模型对象的值,一般用po
命令打印出来的话是该模型对象的地址,而这不是我们想要的。
3,首先自定义命令要求懂一点点Python的知识,直接上主要的pthyon代码。全部代码已经放在gitbub
def run(self, arguments, options):
cls = arguments[0]
ilass = arguments[0]
if not self.isClassObject(cls):
cls = runtimeHelpers.object_getClass(cls)
if not self.isClassObject(cls):
raise Exception('Invalid argument. Please specify an instance or a Class.')
menber_json = self.get_oc_menbers_json(cls,ilass)
print menber_json
def get_oc_menbers_json(mSelf,klass,ilass):
str = """
unsigned int menberCount;
NSMutableDictionary *result = (id)[NSMutableDictionary dictionary];
objc_property_t *properties = (objc_property_t *)class_copyPropertyList((Class)$cls, &menberCount);
for (int i = 0; i<menberCount; i++)
{
char *name = (char *)property_getName(properties[i]);
NSString *ret_name = (NSString *)[NSString stringWithUTF8String:name];
id value = (id)[(NSObject *)$ils valueForKey:ret_name]?:@"nil";
[result setObject:value forKey:ret_name];
}
//free(properties);
RETURN(result);
"""
command = string.Template(str).substitute(cls=klass,ils=ilass)
return fb.evaluate(command)`
其中定义了PrintInstanceDump
的类,需要实现 name description run
方法来分别告诉名称、描述、和执行实体。
创建好脚本后,然后在前面安装时创建的 ~/.lldbinit文件中添加一行:(其中命令保存在了/magical/commands/
)
script fblldb.loadCommandsInDirectory('/magical/commands/')
主要就是使用runtime技术动态获取模型属性。这个还要感谢锤神的指点
参考文章:
好玩的debugDescription & runtime(debug模式下调试model)
Dancing in the Debugger — A Waltz with LLDB