• Xcode查看iOS崩溃与崩溃日志分析


    一、造成崩溃的原因

    1、代码中存在bug

    2、Watchdog 超时机制

    3、用户强制退出

    4、低内存终止

    5、其他违法系统规则的操作,大部分是内存问题

    二、崩溃的类型

    1、信号错误类

    (1)EXC_BAD_ACCESS

    (2)SIGSEVG

     (3)SIGBUS

    (4)SIGTRAP

    (5)EXC_ARITHETIC

    (6)SIGILL

    (7)SIGABRT

    (8)Watchdog 超时

     2、异常类

    (1)NSRangeException(越界异常)

      NSRangeException是iOS开发比较常见的异常。造成异常的原因主要有以下几点:

      a、使用的数组小标超出数组最大下标值

        比如数组长度count, index的下标范围[0, count -1], 在开发时,可能index的最大值超过数组的范围。

      b、使用的数组小标是一个非正常值

        如果小标(index)的值是由其他模块的变量传递进来的,这就会有很大的不确定性, 可能是一个很大的整数值。

        

         

         很明显,上面的值分别是32位和64位下的最大整数值,可能的情况就是传递的index参数获取了无效的值,但仍然拿到NSMutableArray中使用

      比如index通过下面的方式获取。如果找不到str ,则返回NSNotFound,32位下它就是2147483647,64位下18446744073709551615 ,将它作为参数传递则会导致             NSRangeException。

      c、空数组的操作

        如果一个数组刚刚初始化,还是空的,就对它进行相关读取操作,会造成异常。

        

      d、处理的数据范围 NSRange 超过数据本身的长度

        

    (2)NSException

    三、崩溃日志的获取

      如下图:

      

    四、崩溃日志解析

    1、崩溃日志的实例

      

    下面是一份测试过程产生的崩溃日志
    //进程信息
    Incident Identifier: 3C3F8BF8-3099-4E82-92E1-8690212E8FF9
    CrashReporter Key:   bb5f9839ae661ab755f25eff65fee8fd41369628
    Hardware Model:      iPod5,1
    Process:             demo [973]
    Path:                /private/var/containers/Bundle/Application/0D3657DE-DE1E-4FF0-A0F7-C09EBC002763/demo.app/demo
    Identifier:          com.yanghuang.demo
    Version:             17 (1.1.9)
    Code Type:           ARM (Native)
    Parent Process:      launchd [1]
    //基本信息
    Date/Time:           2017-08-22 16:11:49.49 +0800
    Launch Time:         2017-08-22 16:11:40.40 +0800
    OS Version:          iOS 9.3.5 (13G36)
    Report Version:      104
    //异常
    Exception Type:  EXC_BREAKPOINT (SIGTRAP)
    Exception Codes: 0x0000000000000001, 0x00000000e7ffdefe
    Triggered by Thread:  0
    
    Filtered syslog:
    None found
    //线程回溯
    Thread 0 name:  Dispatch queue: com.apple.main-thread
    Thread 0 Crashed:
    0   libswiftCore.dylib              0x0033788c 0x1ac000 + 1620108
    1   ...wiftSwiftOnoneSupport.dylib  0x009b4830 0x9ac000 + 34864
    2   demo                            0x00029288 0x24000 + 21128
    3   demo                            0x00029414 0x24000 + 21524
    4   UIKit                           0x25cd2754 0x25c87000 + 309076
    5   UIKit                           0x25cd26e0 0x25c87000 + 308960
    6   UIKit                           0x25cba6d2 0x25c87000 + 210642
    7   UIKit                           0x25cd2004 0x25c87000 + 307204
    8   UIKit                           0x25cd1c7e 0x25c87000 + 306302
    9   UIKit                           0x25cca68e 0x25c87000 + 276110
    10  UIKit                           0x25c9b124 0x25c87000 + 82212
    11  UIKit                           0x25c996d2 0x25c87000 + 75474
    12  CoreFoundation                  0x216e1dfe 0x21626000 + 769534
    13  CoreFoundation                  0x216e19ec 0x21626000 + 768492
    14  CoreFoundation                  0x216dfd5a 0x21626000 + 761178
    15  CoreFoundation                  0x2162f228 0x21626000 + 37416
    16  CoreFoundation                  0x2162f014 0x21626000 + 36884
    17  GraphicsServices                0x22c1fac8 0x22c16000 + 39624
    18  UIKit                           0x25d03188 0x25c87000 + 508296
    19  demo                            0x0002ff48 0x24000 + 48968
    20  libdyld.dylib                   0x212d7872 0x212d5000 + 10354
    
    Thread 1 name:  Dispatch queue: com.apple.libdispatch-manager
    Thread 1:
    0   libsystem_kernel.dylib          0x213ac2f8 0x21396000 + 90872
    1   libdispatch.dylib               0x212a1d60 0x2128b000 + 93536
    2   libdispatch.dylib               0x212a1abe 0x2128b000 + 92862
    
    ... 省略部分内容
    
    //二进制映像
    Binary Images
    0x24000 - 0x33fff demo armv7   /var/containers/Bundle/Application/0D3657DE-DE1E-4FF0-A0F7-C09EBC002763/demo.app/demo
    0x140000 - 0x15bfff Masonry armv7  <9615e97c54d335f7821568396c65d324> /var/containers/Bundle/Application/0D3657DE-DE1E-4FF0-A0F7-C09EBC002763/demo.app/Frameworks/Masonry.framework/Masonry

    2、进程信息

    第一部分是闪退进程的相关信息。
    
    Incident Identifier 是崩溃报告的唯一标识符。
    
    CrashReporter Key 是与设备标识相对应的唯一键值。虽然它不是真正的设备标识符,但也是一个非常有用的情报:如果你看到100个崩溃日志的CrashReporter Key值都是相同的,或者只有少数几个不同的CrashReport值,说明这不是一个普遍的问题,只发生在一个或少数几个设备上。
    
    Hardware Model 标识设备类型。 如果很多崩溃日志都是来自相同的设备类型,说明应用只在某特定类型的设备上有问题。上面的日志里,崩溃日志产生的设备是iPhone 4s。
    
    Process 是应用名称。中括号里面的数字是闪退时应用的进程ID。

    3、基本信息

      

    这部分给出了一些基本信息,包括闪退发生的日期和时间,设备的iOS版本。如果有很多崩溃日志都来自iOS 6.0,说明问题只发生在iOS 6.0上。
    
    Version: 崩溃进程的版本号. 这个值包含在 CFBundleVersion and CFBundleVersionString中。
    
    Code Type: 崩溃日志所在设备的架构. 会是ARM-64, ARM, x86-64, or x86中的一个。
    
    OS Version: 崩溃发生时的系统版本。

    4、异常信息

      

    异常信息会列出异常的类型、位置。
    
    在这部分,你可以看到闪退发生时抛出的异常类型。还能看到异常编码和抛出异常的线程。根据崩溃报告类型的不同,在这部分你还能看到一些另外的信息。
    
    Exception Codes: 处理器的具体信息有关的异常编码成一个或多个64位进制数。通常情况下,这个区域不会被呈现,因为将异常代码解析成人们可以看懂的描述是在其它区域进行的。
    
    Exception Subtype: 供人们可读的异常代码的名字
    
    Exception Message: 从异常代码中提取的额外的可供人们阅读的信息.
    
    Exception Note: 不是特定于一个异常类型的额外信息.如果这个区域包含SIMULATED (这不是一个崩溃)然后进程没有崩溃,但是被watchdog杀掉了
    
    Termination Reason: 当一个进程被终止的时的原因。
    
    Triggered by Thread: 异常所在的线程.

    5、线程回溯

      

    这部分提供应用中所有线程的回溯日志。 回溯是闪退发生时所有活动帧清单。它包含闪退发生时调用函数的清单。看下面这行日志:
    
    2   demo     0x00029288 0x24000 + 21128
    
    它包括四列:
    
    帧编号—— 此处是2。
    
    二进制库的名称 ——此处是 demo.
    
    调用方法的地址 ——此处是 0x00029288.
    
    第四列分为两个子列,一个基本地址和一个偏移量。此处是0×0x24000 + 21128, 第一个数字指向文件,第二个数字指向文件中的代码行。

    6、二进制映像

    
    

  • 相关阅读:
    笨办法29IF语句
    笨办法28布尔表达式
    笨办法27记住逻辑
    笨办法26恭喜你,可以进行一次考试了
    笨办法25更多更多的练习
    笨办法23复制文件
    成功转移(✿◡‿◡)
    笨办法22到目前为止你学到了什么?
    vue.js
    webpack-优化
  • 原文地址:https://www.cnblogs.com/lxmtx/p/12368543.html
Copyright © 2020-2023  润新知