iOS为真机调试增加scribble来定位野指针

尽管在ARC中,野指针出现的频率已经大大降低了,但是仍然会有野指针困扰着我们。
在模拟器调试中,我们可以开启scribble或者zombieObject来将已经释放的内存填充无意义的内容,能够将一些非必现的野指针变成必现。但是,这只能在模拟器中,但是给测试的包并不能这么做。测试是非常需要这个功能的。
为了给测试支持上这个功能,那么我们不得不自己来实现这个功能。
我首先介绍下我用到的库,来自于Facebook的fishhook

下载地址https://github.com/facebook/fishhook

这是一个c语言的用来实现钩子的函数库,当然你可以选择其他的库。

我所要做的,就是在调用c语言的free函数时,将内存空间破坏掉,也就是用钩子插了一段破坏代码,来实现scribble的功能。

#import <UIKit/UIKit.h>
#import "AppDelegate.h"
#import <dlfcn.h>
#import "fishhook.h"
#include <malloc/malloc.h>

static void (*orig_free)(void* t);

void scribble_free(void* ptr){
    size_t memSizie = malloc_size(ptr);
    memset(ptr, 0x00, memSizie);
    orig_free(ptr);
    return;
}

int main(int argc, char * argv[]) {
    @autoreleasepool {
#if DEBUG
        rebind_symbols((struct rebinding[1]){{"free", scribble_free, (void *)&orig_free}}, 1);
#endif
        return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));;
    }
}

我就直接上代码了,就是在main函数执行时,hook系统的free函数。
malloc_size获取被free的指针的指向的区域的大小。
memset是将ptr指向的内存的前memSizie设置成0x00,也就是全部置0,这样这块区域,再访问的话,那么一定会crash。

posted @ 2016-01-20 15:37  钱鸿强  阅读(589)  评论(0编辑  收藏  举报