美文网首页
2019-05-09: Crash本地符号化一:symbolic

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

作者: 9801525d260a | 来源:发表于2019-05-10 00:13 被阅读0次

    一: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

    相关文章

      网友评论

          本文标题:2019-05-09: Crash本地符号化一:symbolic

          本文链接:https://www.haomeiwen.com/subject/ugpnoqtx.html