在我们平常使用MobileSubstrate tweak的过程中内存问题一般比较难以调试。本文讲介绍一些有用的技巧和工具去定位重复释放或内存泄露导致的问题。
第一种方法就是在你的子类中重写- (void)dealloc方法,然后在方法体中打印Log,这样你就能通过查看syslog中是否打印了日志来确定你的对象是否在使用后彻底释放。如果dealloc没有被调用你或许还需要重新释放一次。记得在你发布的时候去掉那些log,可以简单的通过下面的宏:
#ifndef DEBUG
#define NSLog
#endif
在你的tweak的makefile顶部添加DEBUG=1来开启NSLog,设置为0或者删除来关闭log。你也可以在make的时候带入参数,比如:make package install DEBUG=1.
另外一种非常有用的技巧,在碰到use-after-free所导致的crash的时候开启zombie objects。在任何一个进程中开启zombie objects(比如 SpringBoard),首先ssh到你的设备,然后通过cycript附加:cycript -p 进程名称,接着在cycript中定义_CFEnableZombies(),代码如下:
_CFEnableZombies = new Functor(dlsym(RTLD_DEFAULT, "_CFEnableZombies"), "v");
现在你就能简单的通过调用 _CFEnableZombies()来开启zombile objects。调试的时候打开syslog,当有crash发生的时候会出现如下类似的信息:
: *** -[UIWindow methodSignatureForSelector:]: message sent to deallocated instance 0x162a7730`
好了,在这个例子中通过在代码中查找methodSignatureForSelector:来寻找bug吧。