前言
是这样的,最近面试遇到一个问题,问怎么排查分析crash,说实话做了几年开发,项目中对于crash日志的收集与分析都是用的三方服务,比如bugly,听云之类的,所以一开始听到这个问题不清楚具体在问什么,虽然之前有用过dSYMTools之类的工具分析,不过我印象中还要自己计算函数地址,所以用的很少,当时这个问题就没有回答好,事后研究了下,发现其实并不复杂,所以记录下,废话不多说直接开整
分析crash信息
当我们程序crash时,堆栈看到的都是函数地址,想要定位具体哪里出了问题非常困难,可以通过调试crash日志获取详细信息
分析要准备几个必要文件
- dSYM文件(符号表文件,包含函数,函数地址,文件,行号的映射信息)
- crash文件或ips文件(包含造成crash的具体堆栈,进程信息等)
- symbolicatecrash或CrashSymbolicator文件
- dSYM获取
需要先在xcode进行配置
Build options -> Debug Infomation Format -> DWARF with dSYM File
Generate Debug Symbols -> YES
这一步有些人会关掉,因为关掉可以减小包体积,所以要注意
之后具体获取
- Xcode->Window->Organizer -> Archives -> Finder -> 显示包内容 -> dSYMs
- 项目目录下 -> Products -> xxx.app -> Finder
Crash文件分析
- crash日志获取
如果手机在身边:xcode -> window -> Devieces and Simulators -> View Device Logs -> export 导出crash文件
- symbolicatecrash
进入
/Applications/Xcode.app/Contents/SharedFrameworks/DVTFoundation.framework/Versions/A/Resources/symbolicatecrash
如果路径不对,可在终端用find /Applications/Xcode.app -name symbolicatecrash -type f
命令查找,获取路径后进入文件夹,copy文件出来
三个文件都获取到后,放入同一个文件夹下,终端进入文件夹,执行如下命令
1 | ./symbolicatecrash xxx.crash xxx.dSYM > xxx.log |
如果遇到报错Error: DEVELOPER_DIR" is not defined at ./symbolicatecrash line 69
,就先在终端输入
1 | export DEVELOPER_DIR=/Applications/Xcode.app/Contents/Developer |
之后查看log文件Last Exception
部分
ips文件
- ips获取
设置->隐私->分析->分析数据 -> 导出ips文件(将synced后缀改为ips后缀)
- CrashSymbolicator
进入
/Applications/Xcode.app/Contents/SharedFrameworks/CoreSymbolicationDT.framework/Versions/A/Resources/CrashSymbolicator.py
因为CrashSymbolicator.py有其他模块的路径依赖,所以我们不复制文件,直接通过路径执行
将拿到的dSYM文件和ips文件后放入同一个文件夹下,然后目录下终端执行
1 | python3 /Applications/Xcode.app/Contents/SharedFrameworks/CoreSymbolicationDT.framework/Versions/A/Resources/CrashSymbolicator.py -d xxx.dSYM -p xxx.ips -> xxx.json |
之后查看json文件Last Exception
,CrashSymbolicator输出的是json格式的数据
- 本文标题:iOS Crash日志符号化
- 本文作者:Lazyloading
- 创建时间:2022-07-06 20:30:20
- 本文链接:https://lazy.wiki/posts/b98f7fe4/
- 版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!