美文网首页
异常分析

异常分析

作者: 夜雨聲煩_ | 来源:发表于2017-08-01 17:49 被阅读0次

    本文分析了一份标准的iOS应用程序的Crash报告,它通常由以下6个部分组成。

    报告头(Header)

    报告头包含了应用程序以其运行环境的一些基本信息,下面是报告头的一个例子。
    复制代码
    Incident Identifier: E6EBC860-0222-4B82-BF7A-2B1C26BE1E85
    CrashReporter Key: 6196484647b3431a9bc2833c19422539549f3dbe
    Hardware Model: iPhone6,1
    Process: TheElements [4637]
    Path: /private/var/mobile/Containers/Bundle/Application/5A9E4FC2-D03B-4E19-9A91-104A0D0C1D44/TheElements.app/TheElements
    Identifier: com.example.apple-samplecode.TheElements
    Version: 1.12
    Code Type: ARM (Native)
    Parent Process: launchd [1]
    Date/Time: 2015-04-06 09:14:08.775 -0700
    Launch Time: 2015-04-06 09:14:08.597 -0700OS
    Version: iOS 8.1.3 (12B466)
    Report Version: 105

    异常代码(Exception Codes)

    异常代码可能包含异常类型(Exception Type)、异常子类型(Exception Subtype)、处理器的详细异常代码(processor-specific Exception Codes)和其它能提供更多Crash信息的字段,最后一个字段列出了触发Crash的线程索引。下面是异常代码的示例。
    复制代码
    Exception Type: EXC_CRASH (SIGABRT)
    Exception Codes: 0x0000000000000000, 0x0000000000000000
    Triggered by Thread: 0
    常见的异常类型有以下几种。
    a. Bad Memory Access [EXC_BAD_ACCESS // SIGSEGV // SIGBUS]
    此类型的Excpetion是最常见的Crash,通常由访问了无效的内存导致。
    SIGSEGV:访问了无效地址,没有[物理内存]对应该地址,通常由于重复释放对象导致。
    SIGBUS:总线错误,与 SIGSEGV 不同的是,SIGBUS 访问的是[有效地址]),但总线访问异常,通常是访问了未对齐的数据。
    SEGV:代表无效内存地址,比如空指针、未初始化指针、栈溢出等。
    b. Abnormal Exit [EXC_CRASH // SIGABRT]进程异常退出,造成Crash通常是因为未捕获到Objective-C/C++的异常。
    SIGABRT:收到Abort信号退出,通常Foundation库中的容器为了保护状态正常会做一些检测,例如插入nil到数组中等会遇到此类错误。
    c. 其它异常类型有些异常类型没有被命名,以16进制数字表示。0xbaaaaaad:意味着该Crash log并非一个真正的Crash,它仅仅只是包含了整个系统某一时刻的运行状态,由用户同时按Home键和音量键触发。
    0xbad22222:当VoIP程序在后台太过频繁的激活时,系统可能会终止此类程序。
    0x8badf00d:程序启动或者恢复时间过长被watch dog终止。0xc00010ff:程序执行大量耗费CPU和GPU的运算,导致设备过热,触发系统过热保护被系统终止。
    0xdead10cc:程序退到后台时还占用系统资源(如通讯录)被系统终止。
    0xdeadfa11:程序无响应用户强制退出。当用户长按电源键,直到屏幕出现关机确认画面后再长按Home键,将强制退出应用。我们可以合理认为用户这么做的原因是应用程序没有响应。

    关于符号化:http://blog.csdn.net/rainbowfactory/article/details/73332735
    关于dsym文件:http://www.cocoachina.com/ios/20141219/10694.html

    ips文件中各个线程都是地址,看不到具体的类和方法,需要通过解密,方法如下。

    1.isp文件改为.crash文件
    image.png
    2.打包时产生的xcarchive包
    image.png
    3.连接设备使用log
    image.png
    4.把.crash文件丢进alllogs里
    image.png

    可以看到最终崩溃在28线程中的UACacheManager中。

    相关文章

      网友评论

          本文标题:异常分析

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