iOS 崩潰符號化工具- iOS 15 CrashSymbolicator

這里主要介紹 symbolicatecrash 和 atos 工具的使用, 以及 iOS15 兼容 Json 格式后, 新出的 CrashSymbolicator.py, 三個工具都是 Xcode 自帶, 使用 sh 腳本寫的, symbolicatecrash 實際上也是基于 atos 來進行符號化的, atos 可以針對模塊方法進行符號化解析, symbolicatecrash 是針對整個文件進行符號化

目前有 3 種符號化的方法, 最簡單方便的是直接把崩潰文件拖拽到 Xcode -> Device -> View Device Log 里面, 但是這里這種符號化有一個局限性, 就是當前崩潰的包必須是在當前機器打出來的, 系統(tǒng)才可以進行符號化。

一般 dev/beta/product/ 包可能都不是在自己電腦 Arch 的, 所以我們需要把每次打出來包的 dsym 文件保存到統(tǒng)一的遠程服務(wù)器, 這樣每個開發(fā)可以去直接下載對應(yīng)版本的 dsym, 在結(jié)合下面介紹的 2個工具進行符號化

一、symbolicatecrash

首先通過終端找到 symbolicatecrash 路徑, 通過 ./symbolicatecrash 結(jié)合 dsym 和提供的 crash/ips/beta 文件來進行符號化。

查找 symbolicatecrash 路徑

find /Applications/Xcode.app -name symbolicatecrash -type f

終端會輸出當前 symbolicatecrash 不同系統(tǒng)平臺路徑, 我們使用 SharedFrameworks/DVTFoundation.framework/Versions/A/Resources 里面的 symbolicatecrash。

使用:

& ./symbolicatecrash crashFilePath dsymPath > crashSymbolFilePath

腳本 -> 產(chǎn)生崩潰文件路徑 -> dsym 路徑 > 輸出符號化文件路徑

遇到的問題

  1. Error: "DEVELOPER_DIR" is not defined at ./symbolicatecrash line 69.

    這是因為腳本有執(zhí)行需要依賴環(huán)境宏定義

    查看腳本代碼

    if(!defined($DEVELOPER_DIR)) { die "Error: "DEVELOPER_DIR" is not defined"; }

    執(zhí)行 export DEVELOPER_DIR=/Applications/Xcode.app/Contents/Developer 即可

  2. No crash report version in file

    最近在符號化 iOS 15 以上的崩潰時, 總是提示找不到崩潰版本, 很詭異, 最后查了一下原因是 iOS 15 crash log 格式做了更新, 需要用到下面的 CrashSymbolicator.py 來進行符號化。

  3. UUID 不一致

    當不確定當前崩潰是否跟拿到的 dsym 是否為想對應(yīng)的包時, 使用 dwarfdump --uuid dSYM文件路徑

    查看 dsym UUID: dwarfdump --uuid dSYM文件路徑

    TODO:

    終端會列出當前 dsym 對應(yīng)的 uuid 出來, 在到 crash 文件里面找到對應(yīng)的 Binary Images/ Header 找到對應(yīng)的 uuid 看看是否一致.

    這里看了網(wǎng)上資料說在 crashLog 里面有 Header, 里面有個 slice_uuid 標識當前文件 uuid, 用來和 dsym 的 uuid 對比, 但是看到現(xiàn)在的 crash 文件并沒有此字段, 不知道是不是 Apple 做了格式更新導致的。

二、atos

atos命令將十六進制地址轉(zhuǎn)換為源代碼中可識別的函數(shù)名稱和行號

使用方法

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

atos -arch 指令集 -0 dsym -l 調(diào)用地址 符號模塊地址

*// explain parameters* load adress:可執(zhí)行指令部分相對鏡像文件中的起始加載地址 address to symbolicate:調(diào)用函數(shù)的地址

atos -o xxx.app.dSYM/Contents/Resources/DWARF/xxx -l 0x00000001c4fe7000 -arch arm64

atos -arch arm64 -o xxx.app.dSYM/Contents/Resources/DWARF/xxx -l 0x00000001c4fe7000 0x00000001a2d6e29c

*// extension about xcrun* *// xcrun can accept address to symbolicate on the way in command line.*

xcrun atos -o xxx.app.dSYM/Contents/Resources/DWARF/xxx -l 0x1040dc000 -arch arm64 0x1052c0464 __63-[GCDAsyncUdpSocket asyncResolveHost:port:withCompletionBlock:]_block_invoke.118 (in xxx) (GCDAsyncUdpSocket.m:1209) 0x104ba9094 -[BDAboutController tapButton:atIndex:] (in xxx) (BDAboutController.m:251)

[圖片上傳失敗...(image-144aa4-1641107303891)]

三、CrashSymbolicator.py

因為崩潰文件是 iOS 15 產(chǎn)生, 原來不知道 Apple 做了這一項調(diào)整, 一直在用 symbolicatecrash 進行解析, 終端報錯 No crash report version in file, 查了下資料才發(fā)現(xiàn)新的文件格式得使用 CrashSymbolicator.py 解析

Xcode13 crashLog Update

  • To support the new JSON-format crash logs generated in macOS Monterey and iOS 15, Instruments includes a new CrashSymbolicator.py script. This Python 3 script replaces the symbolicatecrash utility for JSON-format logs and supports inlined frames with its default options. For more information, see: CrashSymbolicator.py --help. CrashSymbolicator.py is located in the Contents/SharedFrameworks/CoreSymbolicationDT.framework/Resources/ subdirectory within Xcode 13. (78891800)

iOS 15 之后 Apple 對符號化文件格式進行了 JSON 支持, 所以針對 iOS 15 以上產(chǎn)生的崩潰文件, 寫入方式應(yīng)該是做了調(diào)整, 所以在對 iOS 15 以上崩潰文件進行符號化時, 直接使用 CrashSymbolicator.py 來解析, 否則會出現(xiàn)符號化失敗, 報錯 No crash report version in file 的問題。

查找

find /Applications/Xcode.app -name CrashSymbolicator -type f

和使用 symbolicatecrash 方式類似, 先找到其路徑, 系統(tǒng)列出不同平臺 sh, 切換到最后一個 /Applications/Xcode.app/Contents/SharedFrameworks/CoreSymbolicationDT.framework/Versions/A/Resources

稍微和 symbolicatecrash 不同的是, 其調(diào)用方式可以支持參數(shù)的方式來排列文件順序,并且其是用 python 寫的腳本, 所以要使用 python3 來進行調(diào)用, 否則會報錯。

-d '符號表路徑' -o '輸出符號化路徑' -p '蘋果給的崩潰日志'

使用

python3 CrashSymbolicator.py -d /dSYMs -o /xxxSymbo.crash -p /xxxCrash.ips

參考資料

你真的了解符號化么?

符號化

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容