iOS_crash文件的获取及符号化(解析)

文章目录

  • [1. 使用 symbolicatecrash 解析 .ips 文件:](#1. 使用 symbolicatecrash 解析 .ips 文件:)
  • [2. 使用 CrashSymbolicator.py 解析 ips 文件](#2. 使用 CrashSymbolicator.py 解析 ips 文件)
  • [3. 使用 atos 解析 crash 文件](#3. 使用 atos 解析 crash 文件)
  • [4. Helps](#4. Helps)
    • [4.1 .ips 文件获取](#4.1 .ips 文件获取)
    • [4.2 .crash 文件获取](#4.2 .crash 文件获取)
    • [4.3 获取 .dSYM 和 .app 文件](#4.3 获取 .dSYM 和 .app 文件)
    • [4.4 使用 dwarfdump 查询 uuid](#4.4 使用 dwarfdump 查询 uuid)
  • [5. Tips](#5. Tips)
  • [6. 总结](#6. 总结)

1. 使用 symbolicatecrash 解析 .ips 文件:

symbolicatecrashXcode自带的crash日志分析工具

步骤1. 找到symbolicatecrash,打开Terminal执行:

shell 复制代码
find /Applications/Xcode.app -name symbolicatecrash -type f

稍等一会,就会输出路径,然后将路径复制,右键 Finder -> 前往文件夹 -> 粘贴 -> 回车,就能找到symbolicatecrash,将symbolicatecrash拷贝出来备用

步骤2. 将./symbolicatecrashcrashdSYM文件放在同一文件夹里

步骤3. 执行解析命令

shell 复制代码
./symbolicatecrash 《crash文件绝对路径》 《拖入xx.app.dSYM里的xx文件》 > log.crash 回车

可能会报错:

错误1:Error: "DEVELOPER_DIR" is not defined at /Users/yourname/Downloads/crash/symbolicatecrash line 69.

解决:执行export DEVELOPER_DIR=/Applications/Xcode.app/Contents/Developer后重试


错误2:No crash report version in /xxx.crash at ./symbolicatecrash line 1365.

原因:Apple 在 Xcode13.3 已经废弃了symbolicatecrash

解决:如果需要使用,需要将.ips转化为之前的格式。可以使用 AppleCrashScripts 进行转化

步骤:

  1. 下载AppleCrashScripts项目,进入到项目目录下
  2. .ips 文件复制到AppleCrashScripts-master文件夹下:
  3. 执行:
shell 复制代码
swift convertFromJSON.swift -i xxx.ips -o log.crash

生成的log.crash就是旧格式的文件了,再用 ./symbolicatecrash 进行解析。


2. 使用 CrashSymbolicator.py 解析 ips 文件

步骤1. 找到CrashSymbolicator.py文件,
find /Applications/Xcode.app -name CrashSymbolicator.py -type f

结果:
/Applications/Xcode.app/Contents/SharedFrameworks/CoreSymbolicationDT.framework/Versions/A/Resources/CrashSymbolicator.py

步骤2. 使用CrashSymbolicator.py.dSYM.ips文件进行解析

shell 复制代码
python3 《CrashSymbolicator.p文件路径》 -d xxx.dSYM -p xxx.ips

运行结果会直接显示在terminal里,需要的可以复制出来保存一下。

步骤3. 分析

shell 复制代码
...
"queue": "com.apple.main-thread",
"frames": [
  {
    "imageOffset": 117622764,
    "imageIndex": 0,
    "symbol": "__57-[QNBUALiveFeedCategoryChannelViewController viewDidLoad]_block_invoke",
    "sourceFile": "QNBUALiveFeedCategoryChannelViewController.m",
    "sourceLine": 80,
    "symbolLocation": 32
  },
  ...
  ]
...

找到了崩溃时主线程正在执行的代码,invoke了一个空的block


3. 使用 atos 解析 crash 文件

命令格式:

shell 复制代码
atos -arch <Binary Architecture> -o <Path to dSYM file>/Contents/Resources/DWARF/<binary image name> -l <load address> <address to symbolicate>

操作:

shell 复制代码
atos -arch arm64 -o 《拖入xxx.app.dSYM里的xxx文件》 -l 《基地址》《偏移后的地址》

Tips: xxx 为项目名

shell 复制代码
如1:
atos -arch arm64 -o ~/xxx.app.dSYM/Contents/Resources/DWARF/xxx 0x10b3e47ec 0x1043b8000

atos -arch arm64 -o ~/xxx.app.dSYM/Contents/Resources/DWARF/xxx 0x104885ec0 0x1043b8000

-[TTAttributedLabel encodeWithCoder:] (in xxx) (TTAttributedLabel.m:1534)
-[QNBUAPosterVerticalPaddingPicViewModel posterBackgroundOperation] (in xxx) (QNBUAPosterVerticalPaddingPicViewModel.m:115)

4. Helps

4.1 .ips 文件获取

  1. 设备 -> 设置 -> 隐私与安全性 -> 分析与改进 -> 分析数据 -> (对应app名+时间点)
  2. TestFlight 的可以在 iTunes Connect 获取到崩溃日志
    iTunes Connect -> Manage Your Applications -> 对应app -> View Detail -> Crash Reports (已符号化)
  3. Xcode -> Window -> Origanizer -> Crash 获取 (需登录开发者账号)
    需要用户共享分享,才能获取到他的崩溃日志
    官方提供的崩溃信息不是实时的,只能查看两天前的崩溃信息,需要试试可以使用第三方工具

4.2 .crash 文件获取

设备连接电脑 XCode -> Windows -> Device and Simulator -> View Device Logs -> (对应app名+时间点) -> 右键 Export Log

4.3 获取 .dSYM 和 .app 文件

.dSYM是十六进制函数地址映射信息的中转文件,调试的symbols会包含在这个文件中,symbols即类名、函数名等。

  1. Archives打包时,应该保存每个正式版的dSYMapp文件,以备定位线上问题使用

Window -> Organizer -> Archives -> 右键(需要的包) -> Show in Finder -> 右键 .xcarchive 显示包内容

Tips:Archives包文件路径为:~/Library/Developer/Xcode/Archives

  1. debug模式获取

修改设置:Xcode -> Targets -> Build Setting

2.1:Debug Infomation Format -> DWARF -> DWARF with dSYM File

2.2:Generate Debug Symbols -> YES

用真机编译就能生成.dSYM.app文件了,在项目工程的Products文件夹里,右键 xxx.app 文件 -> Show in Finder -> 就能找到

4.4 使用 dwarfdump 查询 uuid

查询.dSYMuuid,确保跟.ips.crash文件的uuid一致

shell 复制代码
dwarfdump -u <dSYM所在文件路径>

5. Tips

  • Tips1: Apple deprecated symbolicatecrash at Xcode13.3, use atos instead
  • Tips2: 有些app有很多dSYM文件,需要把所有dSYM文件都拷贝到待解析文件同一文件夹下
  • Tips3: simulator不会生成crash文件
  • Tips4: XCode设置生成dSYM文件,并跑到真机上,此时app产生的.ips文件会自动符号化

6. 总结

  • CrashSymbolicator.py解析结果显示在 Terminal 里,且 没有保持原来的堆栈格式
  • atos效率好低,只能一个地址一个地址的解析
  • symbolicatecrash被废弃了,但文件进过转换还能用,且会解析一整个文件,还保留原来的堆栈格式(推荐使用)

参考:
Diagnosing issues using crash reports and device logs
Acquiring crash reports and diagnostic logs
Understanding Crashes and Crash Logs
iOS Debugging Magic
iOS Crash 分析攻略

本文的描述很难不掺杂作者的主观意见,如果对文章中的内容有疑问,欢迎评论区提出不同的意见进行讨论

相关推荐
大熊猫侯佩9 小时前
桃花岛 Xcode 构建秘籍:Swift 中的 “Feature Flags” 心法
app·xcode·swift
悄然林静9 小时前
Mac终端执行`brew doctor`报`openssl@1.1`警告
mac·xcode·apple
用户099 小时前
SwiftUI Charts 函数绘图完全指南
ios·swiftui·swift
YungFan9 小时前
iOS26适配指南之UIColor
ios·swift
权咚1 天前
阿权的开发经验小集
git·ios·xcode
用户091 天前
TipKit与CloudKit同步完全指南
ios·swift
法的空间1 天前
Flutter JsonToDart 支持 JsonSchema
android·flutter·ios
2501_915918411 天前
iOS 上架全流程指南 iOS 应用发布步骤、App Store 上架流程、uni-app 打包上传 ipa 与审核实战经验分享
android·ios·小程序·uni-app·cocoa·iphone·webview
00后程序员张1 天前
iOS App 混淆与加固对比 源码混淆与ipa文件混淆的区别、iOS代码保护与应用安全场景最佳实践
android·安全·ios·小程序·uni-app·iphone·webview
Magnetic_h2 天前
【iOS】设计模式复习
笔记·学习·ios·设计模式·objective-c·cocoa