iOS Crash atos命令
iOS Crash分为两种,
一种是系统内存错误,触发EXC_BAD_ACCESS引起的,程序运行过程中访问了错误的内存地址,
另一种是出现了不能被处理的signal异常,导致程序向自身发送了SIGABRT信号而崩溃,
1. 利用NSSetUncaughtExceptionHandler处理
iOS提供了异常发生的处理API,NSSetUncaughtExceptionHandler,我们在程序启动的时候可以添加这样的Handler,这样的程序发生异常的时候就可以对这一部分的信息进行必要的处理,适时的反馈给开发者。
需要注意的是,利用NSSetUncaughtExceptionHandler可以用来处理异常崩溃,崩溃报告系统会用NSSetUncaughtExceptionHandler方法设置全局的异常处理器。如果自定义NSSetUncaughtExceptionHandler监听事件,会导致第三方监听(如Bugly)失效,已经集成了第三方监听平台的小伙伴需要注意。
2. 通过保存的线上app的dSYM符号表查找问题。
iOS构建时产生的符号表,它是内存地址与函数名,文件名,行号的映射表。 符号表元素如下所示:
当应用crash时,我们可以利用crash时的堆栈信息得到对应到源代码的堆栈信息,还能看到出错的代码在多少行,所以能快速定位出错的代码位置,以便快速解决问题。
获取到dSYM符号表和之前的程序崩溃的错误日志,我们就可以定位问题了。
利用atos命令定位问题。
atos命令来符号化某个特定模块加载地址 atos [-arch 架构名] [-o 符号表] [-l 模块地址] [方法地址]
使用终端计算,首先获得十六进制地址区间。
1.将需要符号化的.ipa文件和.dSYM 两个文件放在同一个文件夹下;
2.打开终端cd 进入存放上面两个文件的目录下;
3.执行下面的命令:
xcrun atos -o AppName.app.dSYM/Contents/Resources/DWARF/iOSApp -l 0x1a000 -arch armv7
上面命令回车之后,输入如下地址:
0x000bd89d
可以得到结果:
-[XXViewController viewDidLoad](in AppName)(XXViewController.m:114)