以前对于这方面了解的很少,在工作中需要用到这方面的东西,所以,把自己学习的东西写出来分享一下。
对于carsh日志来说,我们有这么几种的获取方式:
1,直接从真机获取,连接手机,然后在Xcode->Device->View Device Log 然后找对对应的app日志。结果如下图所示:
像这样的其实是已经符号化完成的日志,我们可以看出是在什么方法中哪一个类中产生的崩溃。
2.就是使用类似bugly的第三方。这样的第三方会收集崩溃信息,虽然这样的第三方已经对崩溃信息进行了符号化。但是有时候并不能准确的定位到是哪一个类哪一个方法产生的崩溃。那就需要我们对收集到的crash日志进行符号化。
Crash日志包含了进程信息、基本信息、异常信息、线程回溯、Crash的调用栈、动态库的信息。对于这样的日志,如果没有符号化是基本不可能出崩溃出现的地方的,所以需要对Crash日志进行符号化处理。符号化处理的方式有一下两种:
1.Xcode符号化
2.symbolicatecrash脚本符号化
但是这两种符号化的方式都是基于atos(mac自带)。这里就讲一下如何利用atos对Crash日志进行符号化处理。使用atos符号化,首先要找到dSYM文件。dSYM文件是在编译时生成的,可以在Xcode-Window-Organizer-Archives中找到打包后的文件显示包内容,即可找到dSYM文件。
使用如下的atos命令就可以符号化的处理:
atos -arch 内核类型 -o dSYM 路径 -l base address load address
在实际中,由于Crash日记的搜集是我们自己弄得,在计算load address的时候遇到了一些问题,这里把如何计算load address的方法也写一下
NSString *slide = @"";
for (uint32_t i = 0; i < _dyld_image_count(); i++) {
if (_dyld_get_image_header(i)->filetype == MH_EXECUTE) {
slide = [NSString stringWithFormat:@"%lx", _dyld_get_image_vmaddr_slide(i)];
break;
}
}
后来找到了个大神写的符号化的工具很方便我把它分享出来地址如下:https://pan.baidu.com/s/1c2oo3vE
如果有不对的地方或不明白的地方请给我留言!