记录最近一次遇到的问题。
最近一个项目的crash report是自己写的原生的方法,再次启动后提交到自己服务器。自己运行测试的时候没有问题,获取的日志可以追踪到错误的代码位置。但是后来发布正式版后,服务器上接收到了几个日志,于是下载下来追踪,但是发现全部都是Application received signal SIGABRT这种错误。根据地址分析之后只能查到是UmengSignalHandler,但是代码里根本搜不到这个,看名字猜想这个应该是友盟的crash report,然后网上找到确实存在冲突的问题,即使没有使用友盟的crash report(我只是用到了友盟的统计和推送)。
以下是解决冲突的办法
思路:
首先保存第三方的 ExceptionHandler
,再设置自己处理 exception
的 ExceptionHandler
,在自己的 ExceptionHandler
处理完异常之后,再将异常塞给之前的第三方 ExceptionHandler
代码:
static NSUncaughtExceptionHandler *_previousHandler;
+ (void)setDefaultHandler {
_previousHandler = NSGetUncaughtExceptionHandler();
NSSetUncaughtExceptionHandler(&UncaughtExceptionHandler);
}
// 崩溃时的回调函数
void UncaughtExceptionHandler(NSException * exception) {
//处理崩溃,比如保存崩溃信息
//todo~~
//将异常塞给之前的第三方
_previousHandler(exception);
}
另外关于崩溃日志的分析
- 获取dSYM文件
Xcode-> Window -> Organizer -> 选中需要的Archives -> 右击show in finder -> 右击显示包内容 -> dSYMs文件夹中即可找到dSYM文件 - 把这个dSYM文件拷贝到新的文件夹(最好是你再桌面新建一个)
- 右键dSYM文件显示包内容--》Contents--》Resources--》DWARF,里面有个项目的文件,记录下这个文件路径
- 找到解析的地址(地址一般就是你项目名对应的第一条地址记录,如下图)
- 将改地址减去偏移值slide值(偏移值需要在捕捉异常时获取,不知道的可以网上找找方法)得到一个新地址(地址是16进制的,而偏移值是十进制的,注意转换)
- 在终端运行如下命令(直接把DWARF文件夹拖进终端就可以填充项目路径了)
$atos -o DWARF路径 项目名 新地址
这样就可以定位到具体代码了