飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 4121|回复: 4

[iOS] 如何调试tweak开发过程中遇到的内存问题

[复制链接]
  • TA的每日心情
    奋斗
    2015-10-29 08:08
  • 签到天数: 3 天

    [LV.2]偶尔看看I

    发表于 2016-2-20 09:33:18 | 显示全部楼层 |阅读模式
    在我们平常使用MobileSubstrate tweak的过程中内存问题一般比较难以调试。本文将介绍一些有用的技巧和工具去定位重复释放或内存泄露导致的问题。

    第一种方法就是在你的子类中重写- (void)dealloc方法,然后在方法体中打印Log,这样你就能通过查看syslog中是否打印了日志来确定你的对象是否在使用后彻底释放。
    如果dealloc没有被调用你或许还需要重新释放一次。
    记得在你发布的时候去掉那些log,可以简单的通过下面的宏:
    [C] 纯文本查看 复制代码
    #ifndef DEBUG
    #define NSLog
    #endif


    在你的tweak的makefile顶部添加DEBUG=1来开启NSLog,设置为0或者删除来关闭log。
    你也可以在make的时候带入参数,比如:
    [C] 纯文本查看 复制代码
    make package install DEBUG=1.

    另外一种非常有用的技巧,如果你有在碰到use-after-free所导致的crash的时候开启zombie objects的经验的话,
    在任何一个进程中开启zombie objects(比如 SpringBoard),首先ssh到你的设备,然后通过cycript附加:
    [C] 纯文本查看 复制代码
    cycript -p 进程名称


    接着在cycript中定义_CFEnableZombies(),代码如下:

    [C] 纯文本查看 复制代码
    _CFEnableZombies = new Functor(dlsym(RTLD_DEFAULT, "_CFEnableZombies"), "v");


    现在你就能简单的通过调用 _CFEnableZombies()来开启zombile objects。
    调试的时候打开syslog,当有crash发生的时候会出现如下类似的信息:
    <Error>: *** -[UIWindow methodSignatureForSelector:]: message sent to deallocated instance 0x162a7730`
    好了,在这个例子中通过在代码中查找methodSignatureForSelector:来寻找bug吧。

    译:http://sharedinstance.net/2014/02/debugging-memory-issues/


    PYG19周年生日快乐!
  • TA的每日心情
    难过
    前天 14:49
  • 签到天数: 11 天

    [LV.3]偶尔看看II

    发表于 2016-2-20 09:43:48 | 显示全部楼层
    c版 你不是不用theos的么?

    点评

    恩啊。。  发表于 2016-2-20 09:45
    PYG19周年生日快乐!
  • TA的每日心情
    无聊
    3 小时前
  • 签到天数: 2489 天

    [LV.Master]伴坛终老

    发表于 2016-2-20 23:30:14 | 显示全部楼层
    看楼主的帖子,长见识了
    PYG19周年生日快乐!
  • TA的每日心情
    开心
    2016-2-5 11:46
  • 签到天数: 1 天

    [LV.1]初来乍到

    发表于 2016-2-21 09:27:33 | 显示全部楼层
    谢谢分享,学习到很多,非常感谢
    PYG19周年生日快乐!
    您需要登录后才可以回帖 登录 | 加入我们

    本版积分规则

    快速回复 返回顶部 返回列表