iOS App开发问题排查

949 阅读2分钟

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都搜出来。

开发过程中,需养成 及时清理所有编译警告的好习惯!