2019-05-09: Crash本地符号化一:symbolicatecrash

一:Crash-本地符号化1:symbolicatecrash

  • 1.symbolicatecrash是xcode自带的符号表工具
  • 2: 准备工作:
    2.1: crash文件(没有符号化的crash文件:16进制的字符)
    2.2: 复制dSYM文件
    2.3: 准备symbolicatecrash工具
    2.4: copy xcode编译好的项目.app

二: 操作步骤

1: 导出真机crash文件?

1: xcode连接真机 -> window -> Devices and simulators -> View Device Logs


1.png

2.png

说明 :(还有一点就是如果打包的电脑跟你解析crash的电脑是同一个的话,那么这里导出的日志应该是解析好的,这是因为在打包的时候会建立 .app 及 .dYSM 两个文件的索引,所以可以自动解析 crash log 文件,要是没解析的话估计需要自己按照下面的方法解析了。)

2: 复制dSYM文件?

解读:其实是一个目录,在子目录中包含了一个16进制的保存函数地址映射信息的中转文件,所有Debug的symbols都在这个文件中(包括文件名、函数名、行号等),所以也称之为调试符号信息文件

1: 连接真机 -> window -> Organizer -> 选择对应的archiver的应用、如果没有archiver项目、请上传一下。


1.png

2.png

3.png

3: 复制 xcode编译好的项目.app

解读:xxx.app(一般这个文件是隐藏后缀名的)

1: 将我们真机编译出来的app复制一份出来到桌面


1.png

2.png

2: 方式2: 也如上面DSYM文件获取一样:
Xcode->Window->Organizer找到Archives->右击Show in Finder->右击.xcarchive文件->显示包内容在Products->Applications文件夹中找到xxx.app


001.png

3: 方式3:修改ipa包后缀名为.zip,解压完后的Payload里面就是xxx.app文件(注意:ipa包必须是你出现crash设备安装的ipa包)

4: 找到symbolicatecrash工具

1: 首先找到symbolicatecrash工具存放的地址

1.打开终端输入以下命令:
find /Applications/Xcode.app -name symbolicatecrash -type f

显示结果如下:
====WatchSimulator
/Applications/Xcode.app/Contents/Developer/Platforms/WatchSimulator.platform/Developer/Library/PrivateFrameworks/DVTFoundation.framework/symbolicatecrash

====AppleTV
/Applications/Xcode.app/Contents/Developer/Platforms/AppleTVSimulator.platform/Developer/Library/PrivateFrameworks/DVTFoundation.framework/symbolicatecrash

====iPhoneSimulator
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/Library/PrivateFrameworks/DVTFoundation.framework/symbolicatecrash

====看作真机
/Applications/Xcode.app/Contents/SharedFrameworks/DVTFoundation.framework/Versions/A/Resources/symbolicatecrash

我们获取到最后一条:
/Applications/Xcode.app/Contents/SharedFrameworks/DVTFoundation.framework/Versions/A/Resources/symbolicatecrash

5: 开始合成新的符号化的crash日志report

1: 将上述4个文件放在一个新目录下,比如桌面新建一个文件为crash文件夹,都放在这里面:


1.png

2: 确保三个文件的uuid是一致的
dwarfdump --uuid xxx.app/xxx
dwarfdump --uuid xxx.app.dSYM
crash文件打开后Binary Images:后面第一个大长串就是crash文件的uuid

1:  dwarfdump --uuid DSYM文件或者文件路径
dwarfdump --uuid TestCrashDemo.app.dSYM/

2: dwarfdump --uuid dwarfdump --uuid TestCrashDemo.app/TestCrashDemo

3: Binary Images: 后面第一个大长串就是crash文件的uuid:c011521c6f073688935b713e85e4631c
Binary Images:
0x104938000 - 0x1080affff BMWOne arm64  <c011521c6f073688935b713e85e4631c> /var/containers/Bundle/Application/8C2636F3-99A8-4D9A-A773-DC04BF1E67D5/BMWOne.app/BMWOne
111.png

222.png

3: 三个UUID一致的话就可以利用下面的命令解析:(./symbolicatecrash+.crash文件路径+.app.dSYM路径+>+Log.crash 这几个最好用空格分开,路径用全路径,解析的结果就是Log.crash)

cd crash文件夹(刚才自己创建的)

  • 3.1 执行命令:./symbolicatecrash 拖入准备符号化的crash文件 拖入DSYM文件 > 新的log文件名
如:
/symbolicatecrash /Users/我的电脑名/Desktop/crash/CrashDemo\ \ 2019-5-9\ 下午11-23.crash /Users/我的电脑名/Desktop/crash/CrashDemo.app.dSYM > log.crash
  • 3.2: 显示报错:Error: "DEVELOPER_DIR" is not defined at ./symbolicatecrash line 69.
  • 3.3查询环境变量
    xcode-select -print-path
    显示"/Applications/Xcode.app/Contents/Developer/"
    在终端输入命令:
    export DEVELOPER_DIR=”/Applications/XCode.app/Contents/Developer”
export DEVELOPER_DIR=”/Applications/XCode.app/Contents/Developer”
  • 3.4: 重新操作3.1步骤,成功生成新的log文件(符号化之后的日志文件)

三:注意事项:

1: 【xxx.app.dSMY xxx.app xxx.crash】uuid要一致

四:优秀文章:

完整文章1

dSYM解析工具1

Crash文件结构说明1

debug编译符号表怎么获取

atos工具使用格式



五:线上Crash采集:第三方平台和开源框架?

5.1: 第三方统计crash

1: 国内

  • 1:友盟(阿里)
  • 2:Bugly(腾讯)
  • 3:网易云捕

2:国外

  • 1:Crashlytics(Twitter)
  • 2:Flurry(Yahoo)
5.2 原理?

1: 均是根据系统产生的crash日志进行一次提取或封装、将封装后的crash文件上传到对应的服务器进行解析并统计展示。

5.3: 开源框架?

1: iOS常用的crash收集开源框架有:

  • 1: PLCrashReporter
  • 2: KSCrash
  • 3: CrashKit
  • 4: Countly
    谢谢:具体使用可以直接在github上进行查看

六:线上Crash 统计:第三方?

1: 业界Crash统计一般有两种方案

  • 1: 自己搭建服务器、上传应用信息和崩溃数据(不推荐: 成本太大)
  • 2: 采用第三方平台、进行Crash数据采集和统计、包括分析一体化
    例如:可以使用国内的友盟(阿里)、Bugly(腾讯);国外的Crashlytics(Twitter)

七:线上线下Crash 分析?

1: 一份Crash日志是由一下7部分组成:

  • 1: 进程信息: process info
  • 2: 基本信息: Basic info
  • 3: 异常信息: Exception info
  • 4: 线程回溯: Thread backtracking
  • 5: 堆栈信息(核心关注): Stack info
  • 6: 线程状态:Thread status
  • 7: 动态库信息: Binary info
7.1 进程信息: process info

崩溃进程相关信息

  • 1: Incident Idendifier: 这是Crash唯一标识ID
    如12E38879-3EC9-4F1A-B20C-F0695C514689
  • 2: CrashReporter key: 这是映射到设备的唯一key
    如69f2f3e9acd9b5df38d2c8c59844a69adc303149,如果多个Crash拥有相同的key,说明这系列Crash只发生在一个或少数几个设备上。
  • 3: Hardware model: 设备类型
    如:iPhone8,2。如果很多Crash log都来自相同的设备、说明我们的应用在特定设备上存在问题
  • 4: Process: 应用名称
    如AlipayWallet [13563],里面的数字代表Crash时的PID
  • 5: Path: 应用在手机中的路径
    如:/private/var/containers/Bundle/Application/DC064759-9874-448C-AFB9-A4144D36F75D/AlipayWallet.app/AlipayWallet
  • 6: Identifier: 应用Bundle ID
    如:com.alipay.iphoneclient
  • 7: Code Type: 代码类型
    如:ARM-64 (Native)
7.2 基本信息: basic info

崩溃设备基本信息、包括闪退发生的日期和时间、设备的iOS版本等

  • 1: Date/Time: Crash发生时间
    如:2019-05-09 22:08:59.3018 +0800
  • 2: Launch Time: App 启动时间
    如:2019-05-09 22:08:51.7129 +0800
  • 3: OS Version: iOS 版本
    如:iPhone OS 12.1.4 (16D57),12.1.4 为系统版本, 16D57位Build号
7.3: 异常信息:Exception info

Crash时异常类型、异常码和抛出异常的线程

  • 1: Exception Type: 异常类型
    如:EXC_CRASH (SIGKILL)
  • 2: Exception Codes: 异常码
    如:0x0000000000000000, 0x0000000000000000
  • 3: Triggered by thread: 异常发生的线程
7.4: 线程回溯:Thread backtracking

提供应用中所有线程的回溯日志

7.5: 堆栈信息:Stack info

我们分析Crash最重要的信息,可以帮助我们快速定位Crash位置和原因,这些信息都保存在.dSYM 文件中

7.6: 线程状态:Thread state

Crash时寄存器中的值,一般可忽略
如:Thread 0 crashed with ARM Thread State (64-bit):

7.7: 动态库信息:Binary info

包括模块起始地址、模块结束地址、动态库名称、指令集种类、UUID、安装路径等信息、在后面符号化时需要用到。

7.8: Crash符号化分析工具?

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

推荐阅读更多精彩内容