iOS 崩溃符号化工具- iOS 15 CrashSymbolicator

这里主要介绍 symbolicatecrash 和 atos 工具的使用, 以及 iOS15 兼容 Json 格式后, 新出的 CrashSymbolicator.py, 三个工具都是 Xcode 自带, 使用 sh 脚本写的, symbolicatecrash 实际上也是基于 atos 来进行符号化的, atos 可以针对模块方法进行符号化解析, symbolicatecrash 是针对整个文件进行符号化

目前有 3 种符号化的方法, 最简单方便的是直接把崩溃文件拖拽到 Xcode -> Device -> View Device Log 里面, 但是这里这种符号化有一个局限性, 就是当前崩溃的包必须是在当前机器打出来的, 系统才可以进行符号化。

一般 dev/beta/product/ 包可能都不是在自己电脑 Arch 的, 所以我们需要把每次打出来包的 dsym 文件保存到统一的远程服务器, 这样每个开发可以去直接下载对应版本的 dsym, 在结合下面介绍的 2个工具进行符号化

一、symbolicatecrash

首先通过终端找到 symbolicatecrash 路径, 通过 ./symbolicatecrash 结合 dsym 和提供的 crash/ips/beta 文件来进行符号化。

查找 symbolicatecrash 路径

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

终端会输出当前 symbolicatecrash 不同系统平台路径, 我们使用 SharedFrameworks/DVTFoundation.framework/Versions/A/Resources 里面的 symbolicatecrash。

使用:

& ./symbolicatecrash crashFilePath dsymPath > crashSymbolFilePath

脚本 -> 产生崩溃文件路径 -> dsym 路径 > 输出符号化文件路径

遇到的问题

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

    这是因为脚本有执行需要依赖环境宏定义

    查看脚本代码

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

    执行 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 是否为想对应的包时, 使用 dwarfdump --uuid dSYM文件路径

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

    TODO:

    终端会列出当前 dsym 对应的 uuid 出来, 在到 crash 文件里面找到对应的 Binary Images/ Header 找到对应的 uuid 看看是否一致.

    这里看了网上资料说在 crashLog 里面有 Header, 里面有个 slice_uuid 标识当前文件 uuid, 用来和 dsym 的 uuid 对比, 但是看到现在的 crash 文件并没有此字段, 不知道是不是 Apple 做了格式更新导致的。

二、atos

atos命令将十六进制地址转换为源代码中可识别的函数名称和行号

使用方法

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 调用地址 符号模块地址

*// explain parameters* load adress:可执行指令部分相对镜像文件中的起始加载地址 address to symbolicate:调用函数的地址

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 产生, 原来不知道 Apple 做了这一项调整, 一直在用 symbolicatecrash 进行解析, 终端报错 No crash report version in file, 查了下资料才发现新的文件格式得使用 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 以上产生的崩溃文件, 写入方式应该是做了调整, 所以在对 iOS 15 以上崩溃文件进行符号化时, 直接使用 CrashSymbolicator.py 来解析, 否则会出现符号化失败, 报错 No crash report version in file 的问题。

查找

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

和使用 symbolicatecrash 方式类似, 先找到其路径, 系统列出不同平台 sh, 切换到最后一个 /Applications/Xcode.app/Contents/SharedFrameworks/CoreSymbolicationDT.framework/Versions/A/Resources

稍微和 symbolicatecrash 不同的是, 其调用方式可以支持参数的方式来排列文件顺序,并且其是用 python 写的脚本, 所以要使用 python3 来进行调用, 否则会报错。

-d '符号表路径' -o '输出符号化路径' -p '苹果给的崩溃日志'

使用

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

参考资料

你真的了解符号化么?

符号化

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 225,015评论 6 522
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 96,373评论 3 404
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 172,253评论 0 368
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 61,069评论 1 300
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 70,079评论 6 400
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 53,550评论 1 314
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 41,911评论 3 429
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 40,892评论 0 279
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 47,435评论 1 324
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 39,465评论 3 346
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 41,586评论 1 355
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 37,178评论 5 351
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 42,920评论 3 340
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 33,356评论 0 25
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 34,493评论 1 277
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 50,151评论 3 381
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 46,663评论 2 366

推荐阅读更多精彩内容