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 分析攻略

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

相关推荐
小江村儿的文杰6 小时前
XCode Build时遇到 .entitlements could not be opened 的问题
ide·macos·ue4·xcode
比格丽巴格丽抱7 小时前
flutter项目苹果编译运行打包上线
flutter·ios
网络安全-老纪8 小时前
iOS应用网络安全之HTTPS
web安全·ios·https
1024小神11 小时前
tauri2.0版本开发苹果ios和安卓android应用,环境搭建和最后编译为apk
android·ios·tauri
lzhdim12 小时前
iPhone 17 Air看点汇总:薄至6mm 刷新苹果轻薄纪录
ios·iphone
安和昂12 小时前
【iOS】知乎日报第四周总结
ios
写点什么啦13 小时前
[debug]不同的window连接ubuntu的vscode后无法正常加载kernel
linux·vscode·ubuntu·debug
麦田里的守望者江15 小时前
KMP 中的 expect 和 actual 声明
android·ios·kotlin
_黎明16 小时前
【Swift】字符串和字符
开发语言·ios·swift
ZVAyIVqt0UFji18 小时前
iOS屏幕共享技术实践
macos·ios·objective-c·cocoa