尽管在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。

iOS为真机调试增加scribble来定位野指针的更多相关文章

  1. iOS 真机调试不能连接网络的排错过程

    开发环境: macOS 10.12.1 Xcode 8.1 Qt 5.8 gSOAP 2.8 iPhone 6S+iOS 10.1.1   问题: 使用 Qt Quick 写了一个跨平台的应用,在Wi ...

  2. iOS真机调试之我见

     入职20多天,以前一直以为iOS真机调试是多么复杂的事情,但在公司大牛的帮助下:终于理清头绪,由于公司证书已申请,文章中免不了旁征博引. 1.首先,得有苹果开发者账号,如果在公司,公司会提供:不在公 ...

  3. react native iOS真机调试-联网问题与js严格模式

    rn:strict mode does not allow function declarations in a lexically nested statement https://blog.csd ...

  4. ios真机调试教程(不上架App Store安装到手机)

    原文 不上架App Store安装到手机调试测试,需要用到ios真机调试证书打包的ipa才能安装到非越狱的手机使用. 2017年最新整理的ios真机调试的详细图文步骤流程,轻松的把你开发的ios ap ...

  5. React-Native iOS真机调试(新版)

    2019独角兽企业重金招聘Python工程师标准>>> React-Native iOS真机调试 看到网上很多以前的文章 找到两种方法 一 修改AppDelegate 把URL的替换 ...

  6. 解决低版本Xcode不支持高版本iOS真机调试的问题

    1.现象截图 Could not locate device support files. This iPhone 6s is running iOS 11.1 (15B93), which may ...

  7. IOS 真机调试

    真机调试的步骤: 1.注册成为苹果开发者(99$) 2.登陆苹果开发者主页 https://developer.apple.com/membercenter/index.action 3.点击 Cer ...

  8. iOS真机调试——申请开发者证书

    申请开发者证书 知道了什么是证书,我们现在就开始申请证书了 1. 找到KeyChain钥匙串,在Mac应用里可以找到 2. 在钥匙串的菜单中选择从证书颁发机构请求证书,填写邮件地址,选择储存到磁盘,放 ...

  9. IOS 真机调试以及发布应用 2

    参考网站:http://my.oschina.net/u/1245365/blog/196420 已经有开发证书的直接跳过第一步 第一步:申请“开发证书” 进入苹果开发者99美元账号: 选择:Cert ...

随机推荐

  1. [excel玩转表格教程][1G][AVI]

    [excel玩转表格教程][1G][AVI] 下载地址 :http://www.fu83.cn/thread-222-1-1.html

  2. 【Windows】用信号量实现生产者-消费者模型

    线程并发的生产者-消费者模型: 1.两个进程对同一个内存资源进行操作,一个是生产者,一个是消费者. 2.生产者往共享内存资源填充数据,如果区域满,则等待消费者消费数据. 3.消费者从共享内存资源取数据 ...

  3. 装13失败后的逆袭(ComboBox的联动)

    当我们在做ComboBox的联动的时候飞一般的敲出自认为完美的代码.在运行的时候突然变得不完美了. 比如: 如果发生了这种情况会不会就卡磁了呢 当然不会作为程序猿的我们考的是我们聪明的大脑,当然会想出 ...

  4. Linux 进程间通讯详解四

    msgsnd函数 int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg); --功能:把一条消息添加到消息队列中 --参数 ...

  5. LeetCode:3Sum, 3Sum Closest, 4Sum

    3Sum Closest Given an array S of n integers, find three integers in S such that the sum is closest t ...

  6. C 语言学习 第五次作业总结

    第五次作业,主要学习和复习的是几种循环结构的使用. 在前一次的课堂上,同学们已经学习了分支语句的使用.分支语句和循环语句配合使用,就可以写出更多的,逻辑功能丰富的代码了. 逻辑功能的丰富,也意味着学习 ...

  7. linux基础知识与技能1

    1.隐藏文件与非隐藏文件Linux中:linux中隐藏文件特点是文件名以.开头,跟文件属性无关.在linux中查看隐藏文件用ls -a命令(普通显示ls)2.相对路径与绝对路径什么是路径:路径是用来标 ...

  8. js实现由分隔栏决定两侧div的大小—js动态分割div

    /*================index.html===================*/ <!DOCTYPE html><html lang="zh-cn&quo ...

  9. Python笔记(3)迭代器与生成器

    参考自:http://www.cnblogs.com/huxi/category/251137.html 迭代器 迭代器是访问集合内元素的一种方式,他不能倒退只能一直迭代下去.可以写到for循环in后 ...

  10. 基于MST的立体匹配及相关改进(A Non-Local Cost Aggregation Method for Stereo Matching)

    怀着很纠结的心情来总结这篇论文,这主要是因为作者提虽然供了源代码,但是我并没有仔细去深究他的code,只是把他的算法加进了自己的项目.希望以后有时间能把MST这一结构自己编程实现!! 论文题目是基于非 ...