• XCode5环境下利用crash log调试线上Crash的流程


    1.前言

           本文主要介绍在XCode5环境下,如何根据App自己生成的crashlog来调试真机上运行时产生的crash问题。

     

    2. 步骤

    (1)构造一段会crash的代码,并放到viewDidLoad里面,如下图所示:

      

      以上代码会在objectAtIndex处因为数组越界而crash

    (2)在程序中捕获crash,生成crashlog,并保存到程序自己的沙盒中,如果需要分析线上bug,也可以将log文件上传到自己的服务器中。

         捕获crash很简单,主要是以下步骤:

    • didFinishLaunchingWithOptions   调用NSSetUncaughtExceptionHandler (&UnCaughtExceptionHandler),传入一个C函数的地址,这样,当发生crash时,系统会调用该函数。

             此C函数的原型为void UnCaughtExceptionHandler(NSException *exception);

    • UnCaughtExceptionHandler函数中,根据参数exception中的信息,可以得到crash 的callStackSymbolscallStackReturnAddresses,reason,name,然后将这些内容保存到log文件中。

            代码如下:

             

    (3) 打包生成.ipa文件

          选择Xcode菜单- Product - Archive    ,在弹出的Organize-Archives界面中选择Distribute - Save for enterprise or Ad hoc ,然后选择对应的profile文      件,最后导出为ipa文件,该ipa文件可以用同步助手等工具安装到带有描述文件的iOS设备上。

     

    (4)找到dysm符号文件

            使用Finder前往路径~/Library/Developer/Xcode/Archives/,可以看到日期目录,目录下有后缀名为xcarchive的文件,选中该文件,右键菜单选择“显示包内容”,可以看到一个dsYMs目录,将目录中的XXX.app.dsYM文件拷出来,后面分析会用到。

     

    (5)

    在设备上运行安装的app,app会在viewdidload的时候crash,然后生成crash log,存放到document中。使用工具将crash log复制出来,内容如下:

    =====================Crash Report For Iphone=====================

    Date:

    2013年11月26日星期二 中国标准时间下午2时02分57秒

    Name:

    NSRangeException

     

    main function address:

    0xb6add

     

    Reason:

    *** -[__NSArrayI objectAtIndex:]: index 1 beyond bounds [0 .. 0]

     

    CallStackSymbols:

    0   CoreFoundation                      0x322112bb <redacted> + 186

    1   libobjc.A.dylib                     0x39f2e97f objc_exception_throw + 30

    2   CoreFoundation                      0x3215be8d <redacted> + 164

    3   CrashLogSample                      0x000b6a23 CrashLogSample + 23075

    4   CrashLogSample                      0x000b69b9 CrashLogSample + 22969

    5   UIKit                               0x34038595 <redacted> + 364

    6   UIKit                               0x34078d79 <redacted> + 64

    7   UIKit                               0x34074aed <redacted> + 364

    8   UIKit                               0x340b61e9 <redacted> + 60

    9   UIKit                               0x3407983f <redacted> + 1666

    10  UIKit                               0x3407184b <redacted> + 698

    11  UIKit                               0x34019c39 <redacted> + 1004

    12  UIKit                               0x340196cd <redacted> + 72

    13  UIKit                               0x3401911b <redacted> + 6154

    14  GraphicsServices                    0x35d2f5a3 <redacted> + 590

    15  GraphicsServices                    0x35d2f1d3 <redacted> + 34

    16  CoreFoundation                      0x321e6173 <redacted> + 34

    17  CoreFoundation                      0x321e6117 <redacted> + 138

    18  CoreFoundation                      0x321e4f99 <redacted> + 1384

    19  CoreFoundation                      0x32157ebd CFRunLoopRunSpecific + 356

    20  CoreFoundation                      0x32157d49 CFRunLoopRunInMode + 104

    21  UIKit                               0x34070485 <redacted> + 668

    22  UIKit                               0x3406d301 UIApplicationMain + 1120

    23  CrashLogSample                      0x000b6b23 CrashLogSample + 23331

    24  CrashLogSample                      0x000b6978 CrashLogSample + 22904

     

    CallStackReturnAddress:

     

    841028259

    972220799

    840285837

    748067

    747961

    872646037

    872910201

    872893165

    873161193

    872912959

    872880203

    872520761

    872519373

    872517915

    903017891

    903016915

    840851827

    840851735

    840847257

    840269501

    840269129

    872875141

    872862465

    748323

    747896

     

    (6)根据以上crash log和符号文件来定位crash在源代码中的位置

    •     在以上crash log中,可以看出crash类型是NSRangeException,即数组越界
    •     在CallStackSymbols那一栏中,可以看到程序crash时的调用栈,其中CrashLogSample表示本App。在其中的第4行,可以看到

                3   CrashLogSample                      0x000b6a23 CrashLogSample + 23075

               这行语句表示崩溃发生时用户代码的地址,但是并不能直接用地址0x000b6a23去符号文件中定位,而是要用以下方式定位:

               将该行语句中的23075由10进制转换为16进制,即  0x5a23, 然后加上0x4000,得到0x 9a23。 使用命令行工具进入之前符号文件的目录,输入以下命令,其中crashlogsample应换成自己App的名字。

                atos -o ‘CrashLogSample.app.dSYM/Contents/Resources/DWARF/CrashLogSample' -arch armv7    0x9a23

                 输出结果为:

                 -[ViewController test] (in CrashLogSample) (ViewController.m:30)

                 如图所示:

               

                 对比之前的代码:

                  

                  可以看到已经将crash定位到了ViewController.m文件中的30行。

    3.备注

       本文叙述的流程主要适用于XCode5环境下,对于XCode4的情况,情况略有不同,不过XCode4基本上过时,因此不再详述。

     

     

    ==========================华丽的分割线==============================

     日剧高手是一个根据剧照猜剧名的App,App向用户提供日剧的剧照,由用户来选择答
    案。
       系统里面现在包含三百部日剧的剧照,如果你想知道自己的日剧水平怎么样,就来挑战
    下吧 O(∩_∩)O~

       下载地址:
       https://itunes.apple.com/cn/app/ri-ju-gao-shou/id889031444?mt=8 
    --

     

  • 相关阅读:
    Bootstrap 插件收集
    target和currentTarget
    微信小程序
    flex
    vue中使用icon和打包
    rem的使用
    vue中使用sass和compass
    vue父子组件传递参数
    weex
    常用软件&&网址
  • 原文地址:https://www.cnblogs.com/gugupluto/p/3443259.html
Copyright © 2020-2023  润新知