iOS Crash日志符号化
Lazyloading Lv3

前言

是这样的,最近面试遇到一个问题,问怎么排查分析crash,说实话做了几年开发,项目中对于crash日志的收集与分析都是用的三方服务,比如bugly,听云之类的,所以一开始听到这个问题不清楚具体在问什么,虽然之前有用过dSYMTools之类的工具分析,不过我印象中还要自己计算函数地址,所以用的很少,当时这个问题就没有回答好,事后研究了下,发现其实并不复杂,所以记录下,废话不多说直接开整

分析crash信息

当我们程序crash时,堆栈看到的都是函数地址,想要定位具体哪里出了问题非常困难,可以通过调试crash日志获取详细信息
分析要准备几个必要文件

  1. dSYM文件(符号表文件,包含函数,函数地址,文件,行号的映射信息)
  2. crash文件或ips文件(包含造成crash的具体堆栈,进程信息等)
  3. symbolicatecrash或CrashSymbolicator文件
  • dSYM获取

需要先在xcode进行配置

  1. Build options -> Debug Infomation Format -> DWARF with dSYM File
  2. Generate Debug Symbols -> YES这一步有些人会关掉,因为关掉可以减小包体积,所以要注意

之后具体获取

  1. Xcode->Window->Organizer -> Archives -> Finder -> 显示包内容 -> dSYMs
  2. 项目目录下 -> 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 许可协议。转载请注明出处!