• IOS崩溃日志分析


    -、获取carsh日志

    1.Xcode获取日志

    手机和mac连接后,打开Xcode选择window进入Organizer(快捷方式是 Shift-CMD-2),在 Organizer 窗口上, 选中 Devices 标签栏. 在左侧的导航面板上,选中 Device Logs, 如下图所示:

    选择对应设备的Device Logs菜单,就可以看到崩溃日志。
    打开图最上边的Device Logs菜单就可以看到mac曾经同步过的iOS设备的崩溃日志。

    2.手动获取日志

    日志存放的路径 ~/Library/Logs/CrashReporter/MobileDevice/DEVICE_NAME

    DEVICE_NAME是你想要查看的设备。
    下面是我的终端输出的信息:

    ➜  DiagnosticReports  pwd
    /Users/zhuolaiqiang/Library/Logs/DiagnosticReports
    ➜  DiagnosticReports  ls
    QQ_2014-05-30-132026_Anyhacker.crash            atosl_2014-06-04-151416_Anyhacker.crash         eclipse_2014-05-29-192522_Anyhacker.crash       eclipse_2014-06-02-145714_Anyhacker.crash
    SogouInput_2014-05-29-151154_Anyhacker.crash    atosl_2014-06-04-151447_Anyhacker.crash         
    

    二.符号化

    1.利用Xcode符号化

    app在真机设备上Crash后,我们可以让iOS设备和mac连接,然后打开Xcode选择window进入Organizer(快捷方式是 Shift-CMD-2),在 Organizer 窗口上, 选中对应设备的 Device Logs标签,然后找到对应app日志文件,如图所示:

    这样就可以看到已经符号化完毕的日志。

    2.利用symbolicatecrash脚本符号化

    symbolicatecrash是苹果随Xcode一起提供的专门用来做崩溃日志符号化的脚本工具(perl)。
    symbolicatecrash存放路径是
    "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/PrivateFrameworks/DTDeviceKitBase.framework/Versions/A/Resources/symbolicatecrash"。

    使用方法是:
    symbolicatecrash xx.crash xx.app.dSYM
    xx.crash:需要符号化的崩溃日志文件
    xx.app.dSYM:编译APP时产生的DSYM文件,此文件可以不指定,symbolicatecrash会在硬盘内自动搜索和匹配该文件(前提是你的硬盘内存有这个文件)

    注:要保证app.dSYM、.carsh、.app还有symbolicatecrash脚本在同一目录。

    1.利用Xcode符号化
    2.利用symbolicatecrash脚本符号化

    其实这两种分析方式都使用了同一个工具符号化:***atos***。
    atos是苹果提供的符号化工具,在Mac OS系统下默认安装。
    使用***atos***符号化需要dsym文件。dsym文件是在编译工程的时候生成的,可以在Xcode Organizer的Archives标签栏下找到所有已归档的应用文件。它保存了编译过程的详细信息,其中包括符号信息。

    注意: 你必需同时保留应用二进制文件和.dSYM文件才能将崩溃日志完整符号化。每次提交到iTunes Connect的构建都必需归档。
    .dSYM文件和二进制文件是特定绑定于每一次构建和后续构建的,即使来自相同的源代码文件,每一次构建也与其他构建不同,不能相互替换。
    如果你使用Build 和 Archive 命令,这些文件会自动放在适当位置。 如果不是使用Build 和 Archive命令,放在Spotlight能够搜索到的位置(比如Home目录)即可。
    



    下面我们用***atos***对一条Crash进行符号化
    还是看下面的例子:

    ### 1.进程信息 ###
    Incident Identifier: E4201F10-6F5F-40F9-B938-BB3DA8ED7D50
    CrashReporter Key:   TODO
    Hardware Model:      iPhone4,1
    Process:         Taobao4iPhone [3538]
    Path:            /var/mobile/Applications/E3B51E77-D44D-4B3E-8767-B7DC2008D138/Taobao4iPhone.app/Taobao4iPhone
    Identifier:      com.taobao.taobao4iphone
    Version:         4.8.1
    Code Type:       ARM
    Parent Process:  launchd [1]
    
    ### 2.基本信息 ###
    Date/Time:       2014-09-16 21:39:30 +0000
    OS Version:      iPhone OS 7.1.2 (11D257)
    Report Version:  104
    
    ### 3.异常信息 ###
    Exception Type:  SIGSEGV
    Exception Codes: SEGV_ACCERR at 0xa2400db3
    Crashed Thread:  0
    
    ### 4.线程回溯 ###
    Thread 0 name:  Dispatch queue: com.apple.main-thread
    
    ### 5.Crash调用堆栈 ###
    Thread 0 Crashed:
    0   libobjc.A.dylib                     0x3838760c 0x38375000 + 75276
    1   Taobao4iPhone                       0x012c03e1 0x66000 + 19244001
    2   Taobao4iPhone                       0x012c054f 0x66000 + 19244367
    3   Foundation                          0x2e4de163 0x2e419000 + 807267
    4   CoreFoundation                      0x2dac9167 0x2da2a000 + 651623
    5   CoreFoundation                      0x2dac8d7f 0x2da2a000 + 650623
    6   CoreFoundation                      0x2dac711b 0x2da2a000 + 643355
    7   CoreFoundation                      0x2da31ebf 0x2da2a000 + 32447
    8   CoreFoundation                      0x2da31ca3 0x2da2a000 + 31907
    9   GraphicsServices                    0x3298b663 0x32982000 + 38499
    10  UIKit                               0x3037e14d 0x30310000 + 450893
    11  Taobao4iPhone                       0x0006b349 0x66000 + 21321
    12  Taobao4iPhone                       0x0006a5e8 0x66000 + 17896
    
    Thread 1:
    0   libsystem_kernel.dylib              0x38928808 0x38928000 + 2056
    1   libdispatch.dylib                   0x38869e03 0x3885f000 + 44547
    
    ### 5.动态库信息 ###
    Binary Images:
       0x66000 -  0x19cdfff +Taobao4iPhone armv7  <43ebe409980f31fd9be165a64b002af5> /var/mobile/Applications/E3B51E77-D44D-4B3E-8767-B7DC2008D138/Taobao4iPhone.app/Taobao4iPhone
     0x9fa9000 -  0x9fb4fff  QuickSpeak armv7  <eda7aee380373fad88f17971512f2777> /System/Library/AccessibilityBundles/QuickSpeak.bundle/QuickSpeak
    0x2c667000 - 0x2c669fff  AXSpeechImplementation armv7  <fceb6d31f58d3c41afa9ace822d266a7> /System/Library/AccessibilityBundles/AXSpeechImplementation.bundle/AXSpeechImplementation
    

    我从中选出一条调用进行符号化:

    1   Taobao4iPhone                       0x012c03e1 0x66000 + 19244001
    

    使用下面的命令符号化:

    atos -arch armv7 -o "Taobao4iPhone.app.dSYM" -l 0x66000 0x012c03e1
    

    结果:

    1   Taobao4iPhone   0x012c03e1 -[TBSNSPagesContainerView subviewLayoutPage:] (in Taobao4iPhone) (TBSNSPagesContainer.m:227)
    

    可以看到崩溃的类为TBSNSPagesContainerView,函数为subviewLayoutPage,文件名是TBSNSPagesContainer.m,行数是227行。

    我们返回来看一下atos用法: 

    atos -o dysm文件路径 -l  模块load地址 -arch cpu指令集种类 调用方法的地址
    

    dysm文件路径:可以在Xcode Organizer的Archives标签栏下找到所有已归档的应用文件。它保存了编译过程的详细信息,其中包括符号信息。
    模块load地址:模块加载的基地址,可以在日志的***动态库信息***中找到对应模块的基地址。这里为0x66000
    cpu指令集种类:可以为armv6 armv7 armv7s arm64。具体用哪个,可以参考对应模块的***动态库信息***中确定。如

    0x66000 -  0x19cdfff +Taobao4iPhone armv7  <43ebe409980f31fd9be165a64b002af5> /var/mobile/Applications/E3B51E77-D44D-4B3E-8767-B7DC2008D138/Taobao4iPhone.app/Taobao4iPhone
    

    那么Taobao4iPhone模块的cpu指令集为armv7

    备注:

    1、symbolicatecrash位置

    symbolicatecrash是一个隐藏工具,它在我的Mac中的具体路径如下(Xcode6.1.app请换成你的Xcode名称)

    /Applications/Xcode6.1.app/Contents/SharedFrameworks/DTDeviceKitBase.framework/Versions/A/Resources/symbolicatecrash

    你也可以在终端中输入命令搜索:

    find /Applications/Xcode6.1.app -name symbolicatecrash -type f

    把 这个路径拷贝一下,然后粘到Finder的“前往文件夹”下,前往,就可以看到symbolicatecrash工具了,现在把它也拷到桌面的crash 文件夹里。至此,crash文件夹里现在有4个文件了,分别是.app, .crash, .dSYM,symbolicatecrash。接下来就是用终端敲命令,生成更易分析的crash。

      首先用cd命令进入到crash文件夹下,然后输入以下命令

    ./symbolicatecrash /Users/xxxx/Desktop/crash/InOrder.crash /Users/xxxx/Desktop/crash/InOrder.app.dSYM > Control_symbol.crash

    上 述命令中,"xxxx"和"InOrder"请自行替换成对应的名称。运行,这时候终端可能会报错Error: "DEVELOPER_DIR" is not defined at /usr/local/bin/symbolicatecrash line 53. 这时候在终端中再输入如下(Xcode6.1.app依然是要替换成实际名称)

    export DEVELOPER_DIR="/Applications/Xcode6.1.app/Contents/Developer"
    2、.app.dsYM的位置
     “ 使用Finder前往路径~/Library/Developer/Xcode/Archives/,可以看到日期目录,目录下有后缀名为xcarchive的文件,选中该文件,右键菜单选择“显示包内容”,可以看到一个dsYMs目录,将目录中的XXX.app.dsYM文件拷出来,后面分析会用到。”
    如果查到dsYMs目录,但是文件里面的是空的,找不到XXX.app.dsYM,那么请配置xcode工程Build Settings------>Debug information format ----选DWARF with dSYM File,然后重新生成target即可在dsYMs目录找到XXX.app.dsYM文件。
     
  • 相关阅读:
    [唐胡璐]Selenium技巧- Highlight页面元素
    算法进阶面试题07——求子数组的最大异或和(前缀树)、换钱的方法数(递归改dp最全套路解说)、纸牌博弈、机器人行走问题
    算法进阶面试题06——实现LFU缓存算法、计算带括号的公式、介绍和实现跳表结构
    算法进阶面试题05——树形dp解决步骤、返回最大搜索二叉子树的大小、二叉树最远两节点的距离、晚会最大活跃度、手撕缓存结构LRU
    算法进阶面试题04——平衡二叉搜索树、AVL/红黑/SB树、删除和调整平衡的方法、输出大楼轮廓、累加和等于num的最长数组、滴滴Xor
    算法进阶面试题03——构造数组的MaxTree、最大子矩阵的大小、2017京东环形烽火台问题、介绍Morris遍历并实现前序/中序/后序
    算法进阶面试题02——BFPRT算法、找出最大/小的K个数、双向队列、生成窗口最大值数组、最大值减最小值小于或等于num的子数组数量、介绍单调栈结构(找出临近的最大数)
    算法进阶面试题01——KMP算法详解、输出含两次原子串的最短串、判断T1是否包含T2子树、Manacher算法详解、使字符串成为最短回文串
    算法初级面试题08——递归和动态规划的精髓、阶乘、汉诺塔、子序列和全排列、母牛问题、逆序栈、最小的路径和、数组累加成指定整数、背包问题
    算法初级面试题07——前缀树应用、介绍和证明贪心策略、拼接字符串得到最低字典序、切金条问题、项目收益最大化问题、随时取中位数、宣讲会安排
  • 原文地址:https://www.cnblogs.com/guangyun/p/4692841.html
Copyright © 2020-2023  润新知