Matrixzk’s Blog

keep moving

简述 Crash 文件分析流程

Dec 20th, 2014

虽然现在已经有很多第三方的服务能帮你分析线上 App 的 Crash 文件,但有时还是难免要对单独某个 Crash 文件做分析,本文就是来介绍一下这个流程。

测试环境

前提:App 提交 AppStore 时不是在你的机子上操作的 archive。

环境:Xcode 6

注意,下述方法的时效性比较强,因为苹果也一直在调整优化他们的解决方案。但总体来说应该是向上兼容的,流程只会越来越简单方便。

符号化 Crash 文件

方法一

  1. 从 Xcode 的 Window -> Organizer -> Archives 中通过右键 “Show in Finder” 拿到提交 AppStore 的 archive 文件 *.xcarchive
  2. 右键 *.xcarchive “显示包内容”,拿到 yourAppName.app.dSYM 文件和 yourAppName.app 文件(该文件在你那里可能没有后缀);
  3. 将上述的 yourAppName.app.dSYM 和 yourAppName.app 文件和你拿到的 .crash 文件放到同一个目录下(这里也可以通过其他方式不用把他们放一起,后边会讲到);
  4. 打开 Xcode 的 Window -> Devices,选中你的设备,点击 “View Device Logs”;
  5. .crash 文件拖入上述打开面板的左侧,停几秒就会看到你的 crash 文件出现其中,选中,再隔几秒就会看到被符号化的 crash 文件了,OK。

方法二

将上述 1 拿到的 *.xcarchive 文件拖入你的机子的相应位置,此时直接将 .crash 文件拖入上述 4 打开的面板应该就可以了。

方法三

在上述 3 时,也可以不把 .crash 文件和那俩放到一起,比如那俩文件放在了 MyAppDSYM 目录下,则在命令行执行如下命令: mdimport MyAppDSYM/ 这之后直接执行上述 5 即可。

关于 App 和 .dSYM 文件的 uuid

通过如下命令可查看 App 的 uuid,.crash 文件中所显示的 App 的 uuid 应该和 .app.dSYM 文件的 uuid 都是一致的。例如:

首先说下什么是 UUID。每一个可执行程序都有一个 build UUID 来唯一标识。Crash 日志包含发生 crash 的这个 App 的 build UUID 以及 crash 发生的时候,应用加载的所有库文件的 build UUID。

  1. 拿到 yourAppName.app 的 uuid :

    命令:

     dwarfdump --uuid yourAppName.app/yourAppName
    

    举例:

     dwarfdump --uuid MyAppName.app/MyAppName
    

    结果示例:

     UUID: 78A868EF-49B3-3AAB-AB03-807DA6EF8567 (armv7) MyAppName.app/MyAppName
     UUID: 96A04089-39CF-3BE2-84DD-F1FDA146EA39 (arm64) MyAppName.app/MyAppName
    
  2. 拿到 yourAppName.app.dSYM 的 uuid :

    命令:

     dwarfdump --uuid yourAppName.app.dSYM
    

    举例:

     dwarfdump --uuid MyAppName.app.dSYM
    

    结果示例:

     UUID: 78A868EF-49B3-3AAB-AB03-807DA6EF8567 (armv7) MyAppName.app.dSYM/Contents/Resources/DWARF/MyAppName
     UUID: 96A04089-39CF-3BE2-84DD-F1FDA146EA39 (arm64) MyAppName.app.dSYM/Contents/Resources/DWARF/MyAppName
    
  3. 拿到 *.crash 文件的 uuid :

    < 方法一 >

    命令:

     grep "yourAppName armv" crashFileName.crash
    

    示例:

     grep "MyAppName armv" 001.crash
    

    结果:

     0x3d000 -   0x5c4fff +MyAppName armv7  <78a868ef49b33aabab03807da6ef8567> /private/var/mobile/Containers/Bundle/Application/81C16F53-6CB6-4CEC-80E3-7D65B61FF91B/MyAppName.app/MyAppName
    

    < 方法二 >

    命令:

     grep --after-context=2 "Binary Images:" crashFileName.crash
    

    示例:

     grep --after-context=2 "Binary Images:" 001.crash
    

    结果:

     Binary Images:
        0x3d000 -   0x5c4fff +MyAppName armv7  <78a868ef49b33aabab03807da6ef8567> /private/var/mobile/Containers/Bundle/Application/81C16F53-6CB6-4CEC-80E3-7D65B61FF91B/MyAppName.app/MyAppName
     0x2745d000 - 0x27549fff  RawCamera armv7  <31a1ae8be0ea314e8b2892fc94a3e68a> /System/Library/CoreServices/RawCamera.bundle/RawCamera
    

上述的 <> 内显示的就是相应的 uuid。

另外,还有两种方法符号化 crash 文件,分别是命令行工具 symbolicatecrash 和命令行工具 atos。详细使用参考:分析iOS Crash文件:符号化iOS Crash文件的3种方法

返回顶部