详解ios crash分析

原始文档及Demo可以在 git@gitlab.pri.ibanyu.com:cailei5072/d_palfish_ios.git crash-analyze文件夹下找到

一、各工程说明

lib/MyCrashLib

这个是库工程,其中Target Universal 用来生成对外的Fat Framework, 支持 x86_64 (simulator), arm64 (device)

lib/TestMyCrashLib

直接依赖了MyCrashLib工程,库提供方自己测试用

app/MyCrashApp

依赖Fat Framework,每次Framework发版都需要手动更新,模拟了业务方使用三方Framework的场景

二、crash分析

工程设置的一些定义

<

h3>选项 |

<

h3>值
:————————– | :————-
Build Active Architecture Only | NO
Debug Information Format | DWARF with dSYM File
Strip Debug Symbols During Copy | NO

准备工作

  • lipo -info 确认支持x86_64和arm64
  • 找到xcode自带的symbolicatecrash

可以在path中的路径下生成软链接

sudo ln -s /Applications/Xcode.app/Contents/SharedFrameworks/DVTFoundation.framework/Versions/A/Resources/symbolicatecrash /usr/local/bin/symbolicatecrash
  • export DEVELOPER_DIR="/Applications/Xcode.app/Contents/Developer"

可以添加到启动文件

# ~/.zshrc

# 在最后一行添加
export DEVELOPER_DIR="/Applications/Xcode.app/Contents/Developer"
  • app.dSYM 和 lib.dSYM 放到同一个路径下

开始生成

  • 在手机上运行App,分别点击 AppLib,让其crash在不同的地方
  • ./symbolicatecrash xxx.crash的文件路径 xxx.app.dSYM的文件路径 > log.crash
  • mdfind "com_apple_xcode_dsym_uuids == *"检查下列出的.dSYM全不全

验证

dwarfdump -u dwarfdump -u 可以查看 UUID

➜  快速Dump-Crash实验 git:(master) ✗ dwarfdump -u MyCrashApp.app.dSYM
UUID: D2FD226E-7F12-362F-809D-DC2EBB02A67E (arm64) MyCrashApp.app.dSYM/Contents/Resources/DWARF/MyCrashApp

➜  快速Dump-Crash实验 git:(master) ✗ dwarfdump -u MyCrashLib.framework.dSYM
UUID: 3D50094C-0B91-3D5E-8E1E-110F4F7474C6 (arm64) MyCrashLib.framework.dSYM/Contents/Resources/DWARF/MyCrashLib

.crash文件里载入image时应有

Binary Images:
0x102b1c000 - 0x102b23fff MyCrashApp arm64  <d2fd226e7f12362f809ddc2ebb02a67e> /var/containers/Bundle/Application/D26B9146-4F17-4F5A-AE8F-2FF11D6F2B3B/MyCrashApp.app/MyCrashApp
0x102b4c000 - 0x102b53fff MyCrashLib arm64  <3d50094c0b913d5e8e1e110f4f7474c6> /var/containers/Bundle/Application/D26B9146-4F17-4F5A-AE8F-2FF11D6F2B3B/MyCrashApp.app/Frameworks/MyCrashLib.framework/MyCrashLib


Binary Images:
0x100450000 - 0x100457fff MyCrashApp arm64  <d2fd226e7f12362f809ddc2ebb02a67e> /var/containers/Bundle/Application/D26B9146-4F17-4F5A-AE8F-2FF11D6F2B3B/MyCrashApp.app/MyCrashApp
0x100474000 - 0x10047bfff MyCrashLib arm64  <3d50094c0b913d5e8e1e110f4f7474c6> /var/containers/Bundle/Application/D26B9146-4F17-4F5A-AE8F-2FF11D6F2B3B/MyCrashApp.app/Frameworks/MyCrashLib.framework/MyCrashLib

App UUID :

  • D2FD226E-7F12-362F-809D-DC2EBB02A67E

Lib UUID :

  • 3D50094C-0B91-3D5E-8E1E-110F4F7474C6

两次crash虽然载入的内存段不一样,但是UUID和dSYM中的保持一致

<

h3>

注意:每次代码改动后,生成的UUID会变化,所以一定保证release版本的ipa,dSYM,和git的tag保持一致

三、没有耐心?

已经按照上述做了个可以快速验证结果的,放到了 快速Dump-Crash实验

运行命令

symbolicatecrash app.crash . > app.log
symbolicatecrash lib.crash . > lib.log

并查看结果