众里寻他千百度,蓦然回首,那人却在灯火阑珊处。–《青玉案·元夕》
要学会看crash崩溃和报告
一个应用程序并不总会一直运行的很好,它总会有出现crash崩溃的情况。如果在应用程序中接入了一些第三方的crash收集工具或者自建crash收集报告平台的话将会很好的帮助开发者去分析和解决应用程序在线上运行的问题,当出现的崩溃问题能得到及时的解决和快速的修复时必将会大大的提升应用程序的用户体验。
当前比较流行的crash收集分析工具很多都是基于开源的KSCrash代码来进行封装和改进的。苹果自身也构建了一套crash采集和分析的机制,你可以从真机的联机日志或者从开发者账号中去查看对应的crash信息。网络上也有很多关于crash分析的文章,以及crash堆栈符号化处理的文章。这里假定你已经了解了一些查看crash报告的方法和技巧以及一些简单的crash分析技巧,因为这些是作为开发者需要具备的技能之一。
一个objc_msgSend+16崩溃栈
应用程序出现的crash崩溃异常有一些能够简单的被分析和解决,往往这些crash崩溃异常都会带有明确的上下文信息和函数调用层级堆栈。但并不是所有的crash崩溃异常都能被简单的解决,尤其是那些没有明确上下文信息的函数调用堆栈或者那些调用堆栈中没有一个函数或者方法能够被直接定位到源代码的场景,就如下面这个崩溃的函数调用栈(部分信息):
Incident Identifier: 85BE3461-D7FD-4043-A4B9-1C0D9A33F63DCrashReporter Key: 9ec5a1d3b8d5190024476c7068faa58d8db0371fHardware Model: iPhone7,2Code Type: ARM-64Parent Process: ? [1]Date/Time: 2018-08-06 16:36:58.000 +0800OS Version: iOS 10.3.3 (14G60)Report Version: 104Exception Type: EXC_BAD_ACCESS (SIGBUS)Exception Codes: 0x00000000 at 0x00000005710bbeb8Crashed Thread: 2Thread 2 name: WebThread Thread 2 Crashed:0 libobjc.A.dylib objc_msgSend + 161 UIKit -[UIWebDocumentView _updateSubviewCaches] + 402 UIKit -[UIWebDocumentView subviews] + 923 UIKit -[UIView(CALayerDelegate) _wantsReapplicationOfAutoLayoutWithLayoutDirtyOnEntry:] + 724 UIKit -[UIView(CALayerDelegate) layoutSublayersOfLayer:] + 12565 QuartzCore -[CALayer layoutSublayers] + 1486 QuartzCore CA::Layer::layout_if_needed(CA::Transaction*) + 2927 QuartzCore CA::Layer::layout_and_display_if_needed(CA::Transaction*) + 328 QuartzCore CA::Context::commit_transaction(CA::Transaction*) + 2529 QuartzCore CA::Transaction::commit() + 50410 QuartzCore CA::Transaction::observer_callback(__CFRunLoopObserver*, unsigned long, void*)