iOS 手动解析崩溃日志

最近偶然与到一个线上crash问题,一直无法复现,十分苦恼,大家都知道,如果在开发阶段,完全可以设置全局断点等等方式进行crash定位,但是线上的问题怎么解决呢?

经过研究学习后发现,我们可以通过线上crash日志来进行线上bug的定位。恰巧我们的APP内部集成了talkingdtata,然后就总结一下线上崩溃日志的解析办法。

从talkingdata的崩溃信息列表可以查看崩溃日志,其中形式大约如此:

reason: *** -[__NSCFConstantString substringToIndex:]: Index 1 out of bounds; string length 0
callStackSymbols: (
	0   CoreFoundation                      0x0000000188b86ff8 <redacted> + 148
	1   libobjc.A.dylib                     0x00000001875e8538 objc_exception_throw + 56
	2   CoreFoundation                      0x0000000188b86f28 <redacted> + 0
	3   Foundation                          0x000000018958c928 <redacted> + 128
	4   AppName                           0x0000000100167800 AppName+ 1144832
	5   AppName                           0x000000010014b930 AppName + 1030448
	6   AppName                           0x00000001000d9408 AppName + 562184
	14  UIKit                               0x000000018f289d38 <redacted> + 64
	15  UIKit                               0x000000018f28d56c <redacted> + 124
	16  UIKit                               0x000000018ee47470 <redacted> + 252
	17  UIKit                               0x000000018ece9380 <redacted> + 720
	26  CoreFoundation                      0x0000000188b3542c <redacted> + 24
	27  CoreFoundation                      0x0000000188b34d9c <redacted> + 540
	28  CoreFoundation                      0x0000000188b329a8 <redacted> + 744
	29  CoreFoundation                      0x0000000188a62da4 CFRunLoopRunSpecific + 424
	30  GraphicsServices                    0x000000018a4cc074 GSEventRunModal + 100
	31  UIKit                               0x000000018ed1d058 UIApplicationMain + 208
	32  AppName                           0x00000001001a0aec AppName + 1379052
	33  libdyld.dylib                       0x0000000187a7159c <redacted> + 4
)

Process name: AppName  //App包名
dSYM UUID: CF68106F-F777-3C-8593AB-414C1904A4BA
Architecture: arm64
Start Address: 0x100050000  //起始地址
Slide Address: 0x50000  //偏移地址

因为太长,所以删除了几行没有用的信息 从上述中可以得到很多的信息 包含了崩溃栈信息 App包名 偏移地址 起始地址。

除了这些,平台还展示了崩溃的App版本等信息(可以用于确认版本),如图:


接下来第一步 做准备工作

首先 从talkingdata 下载崩溃信息文件 一般下载之后为CSV格式(也可以直接对照talkingdata线上信息进行处理)。

然后 获取符号表文件:

一次点击 X-code->Window->Organizer->Archives 选中talkingdata 所提示的版本 右键点击 "Show in Finder" 找到 xcarchive 文件。选中 xcarchive 文件 右键点击 "Show Package Contents" 进入 dYSMs 可以看到 dYSM文件。这就是我们需要的!

在电脑桌面 手动创建一个 crash文件夹 然后把 dYSM 文件拷贝到该文件夹之下。

打开 Terminal 命令行操作 cd进入 crash文件夹目录下。

输入:

atos -o AppName.app.dSYM/Contents/Resources/DWARF/AppName -arch arm64 -l 0x100050000 0x0000000100167800
其中 0x100050000:起始地址  0x0000000100167800:崩溃地址

其中崩溃地址一般为 崩溃信息中首行与你的App包名相关的地址 就是该例子中首行与 AppName 相关的地址信息(也就是崩溃信息中标记为4的行)。

最终的打印结果会出现:

…(MapViewController.m:148)

就是说crash的位置在 MapViewController.m文件中的 第148行。

该方法适用于大部分的第三方信息收集SDK,当然有的SDK更智能,直接在错误统计中已经替你查找好了crash位置,只要你每次打包上线的时候把 dYSM 文件上传到他们的服务器。



阅读更多 登录后自动展开
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页