1.分析App中方法调用耗时
参考文档:
llvm 在 iOS 插桩: www.jianshu.com/p/4d392b16d…
iOS开发过程中,如果想要分析耗时调用,有三种方法:
方法1:TimeProfile工具。
方法2:hook objc_msgSend方法,实现比较简单,但是有个局限性,只对objective-c方法有效,对c函数和block就不行了。
方法3:LLVM插桩,可以统计所有的函数,但是,实现比较复杂。
总结:
直接pod引入文章作者开源的pod库,然后运行即可。不需要的时候去掉去掉pod就行了。
pod 'LYFunTime', :configurations => ['Debug'], :git=>'https://github.com/lyleyang/LYFunTime.git'
然后通过修改 pod库中 LYFunTime.c的 _ly_fun_b和 _ly_func_e 的逻辑做一些定制化处理。例如:只打印耗时超过100us的函数调用,代码如下:
void _ly_fun_e(char *name, long b){
struct timeval end;
gettimeofday(&end, NULL);
long e = end.tv_sec * 1000000 + end.tv_usec;
long t = e - b;
if (t > 100) {
printf("%s %ld us\n",name, t);
}
}
通过该pod库,可以实现如下功能:
-
获取耗时的函数调用;
-
获取某个操作的所有函数调用。比如逆向分析过程中,大型App往往业务逻辑错综复杂,如果想知道点击某个按钮时App具体调用了哪些方法,这时候就可以派上用场。
2.内存泄漏问题
问题:数据变化时,需要更新UI;对View/ViewController下断点,断点正常,但是UI界面并没有变化为新数据,点击界面上的按钮等,也能正常响应。 碰到这种问题,首先应该想到的是 View/ViewController是否发生了内存泄漏。即界面上看到的是一个实例,而断点断点断下来的是另外一个实例对象。
方法1: 通过内存图查看是否有多个实例;
方法2:下断点查看当前实例内存地址 以及pvc查看当前导航栈中是否同一个实例。
3.App功能:debug正常,release异常
背景:
app中集成多个静态库,由好几个部门开发,都是C/C++开发的.a库。 App真机调试的时候没有问题,但是打出来的release包就功能不正常,最后排查是有 .a库中的函数名冲突了,导致功能异常。
解决方法: 编译App项目,然后搜索编译日志:
1)C函数冲突:搜索编译日志:Duplicate symbol
2)OC的category方法冲突:搜索编译日志: conflicts with same method from another category
3)如果是使用 jenkins + fastlane自动打包的话,可以将 fastlane的打包日志输出重定向到文件,然后进行过滤:ld: duplicate symbol。
4)或者搜索:ld: warning: 即可把1,2都搜出来。
开发过程中,需养成 及时清理所有编译警告的好习惯!