概述
最近偶然与到一个线上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文件。通过DSYM UUID找到相对应的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 文件上传到他们的服务器。
最后
以上就是阳光过客为你收集整理的iOS 手动解析崩溃日志的全部内容,希望文章能够帮你解决iOS 手动解析崩溃日志所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复