这两周一直在研究如何追踪线上的bug,如何快速分析出程序到底崩溃在什么地方,从底层了解Crash是如何产生的、如何传递的、以及是如何分析出来的。虽然项目组并没有对这些要求很严格,但是作为一个高级开发人员这些是我们必须要了解的,要弄明白的。之前项目中用的是Bugly,其实接入Bugly之后,大部分问题不需要我们自己去研究了,对于追踪闪退等问题Bugly都帮我们做了。
1、iOS中Crash的产生和捕获
捕获闪退和异常主要就是捕获系统产生的Mach异常和Unix信号。之后就是根据捕获到的异常信息去做分析的。详细的可以参考我博客中另一篇文章:iOS中Mach异常和signal信号介绍,以及当APP崩溃时做线程保活弹出程序异常提示框
2、如何获取Crash具体信息和Crash文件
(1)、自己捕获Crash信息,上传到自己服务器或者直接发送到邮箱里。
(实现方法:1、利用系统提供的NSSetUncaughtExceptionHandler方法直接捕获异常信息。但是这个方法捕获的异常有限,不能捕获例如由于内存访问错误等产生的signal。2、自己写一个处理异常的类,监听想要监听的signal信号,具体实现可以参考:iOS中Mach异常和signal信号介绍,以及当APP崩溃时做线程保活弹出程序异常提示框)
(2)、通过Xcode-Devices-View Device Logs,去查找文件。(参考:Xcode:iOS崩溃日志分析方法)
(3)、通过Xcode-Organizer-Crashs,查找线上崩溃报告。(定位不全面、不是很靠谱、还需要用户开启共享隐私数据)
(4)、接入Bugly等第三方统计工具。
3、拿到Crash的具体信息,利用符号表去解析
说一下dSYM,不管是自己还是Bugly去解析Crash都需要dSYM。因为dSYM里边存着符号表,符号表里边存的就是内存地 址、函数地址、偏移量等内容。我们分析Crash文件的时候,就是拿崩溃的内存地址,去符号表里边找到对应的方法。
有关dSYM的详细介绍可以看Bugly官方文档的总结:iOS符号表
这里说一下如何查看UUID:
1、查看dSYM文件的的UUID,命令行执行:xcrun dwarfdump --uuid xxx(xxx为dSYM的路径)
2、查看.crash文件的UUID,在crash日志中的Binary Images:中的第一行尖括号内。如:armv7 <8bdeaf1a0b233ac199728c2a0ebb4165>
推荐一个Github上根据dSYM定位崩溃的工具:https://github.com/answer-huang/dSYMTools
另外,推荐几篇总结的不错的博客,大家可以看看:
iOS crash log 解析 symbol address = stack address - slide 运行时获取slide的api 利用dwarfdump从dsym文件中得到symbol