一、造成崩溃的原因

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、二进制映像


Xcode查看iOS崩溃与崩溃日志分析的更多相关文章

  1. iOS symbolicatecrash工具crash日志分析

    若一个App没有加入Crashlytics或者Buggly这些崩溃日志监控,那么我们在App崩溃的时候如何获取崩溃信息呢? 此时我们可以通过symbolicatecrash工具对手机日志来进行分析定位 ...

  2. Windwos日志分析

    Windows日志分析工具 查看系统日志方法: 在“开始”菜单上,依次指向“所有程序”.“管理工具”,然后单击“事件查看器” 按 "Window+R",输入 ”eventvwr.m ...

  3. 【转】iOS应用崩溃日志分析

    作为一名应用开发者,你是否有过如下经历?   为确保你的应用正确无误,在将其提交到应用商店之前,你必定进行了大量的测试工作.它在你的设备上也运行得很好,但是,上了应用商店后,还是有用户抱怨会闪退 ! ...

  4. iOS应用崩溃日志分析

    转自raywenderlich   作为一名应用开发者,你是否有过如下经历?   为确保你的应用正确无误,在将其提交到应用商店之前,你必定进行了大量的测试工作.它在你的设备上也运行得很好,但是,上了应 ...

  5. iOS崩溃日志分析-b

    1名词解释 1.1. UUID 一个字符串,在iOS上每个可执行文件或库文件都包含至少一个UUID,目的是为了唯一识别这个文件. 1.2. dwarfdump 苹果提供的命令行工具,其中一些功能就是查 ...

  6. iOS应用崩溃日志分析 iOS应用崩溃日志揭秘

    转自:http://www.raywenderlich.com/zh-hans/30818/ios%E5%BA%94%E7%94%A8%E5%B4%A9%E6%BA%83%E6%97%A5%E5%BF ...

  7. iOS,应用崩溃日志分析

    参考资料:http://www.cocoachina.com/industry/20130725/6677.html 1.获得崩溃日志 2.崩溃日志实例 3.符号化崩溃日志 4.低内存闪退 获得崩溃日 ...

  8. iOS 崩溃日志分析(个人总结,最实用)

    iOS 崩溃日志分析(个人总结,最实用) 要分析奔溃日志需要三个文件:crash日志,symbolicatecrash分析工具,.dSYM符号集 0. 在桌面创建一个crash文件夹 1. 需要Xco ...

  9. iOS开发-应用崩溃日志揭秘(一)

    作为一名应用开发者,你是否有过如下经历? 为确保你的应用正确无误,在将其提交到应用商店之前,你必定进行了大量的测试工作.它在你的设备上也运行得很好,但是,上了应用商店后,还是有用户抱怨会闪退 ! 如果 ...

随机推荐

  1. nodejs(10)express路由

    后端路由 前端请求的URL地址,都要对应一个后端的处理函数,那么 这种URL地址到 处理函数之间的对应关系,就叫做后端路由: 在Express中,路由的主要职责 就是 把客户端的请求,分发到对应的处理 ...

  2. NSDictionary和NSMaptable, NSArray,NSSet,NSOrderedSet和NSHashTable的区别

    NSSet, NSDictionary, NSArray是Foundation框架关于集合操作的常用类, 和其他标准的集合操作库不同, 他们的实现方法对开发者进行隐藏, 只允许开发者写一些简单的代码, ...

  3. pandas中DataFrame重置设置索引

    在pandas中,经常对数据进行处理 而导致数据索引顺序混乱,从而影响数据读取.插入等. 小笔总结了以下几种重置索引的方法: import pandas as pd import numpy as n ...

  4. 1. 现代 javascript 用法 简介 及 babel

    简介 包含 ECMAScript 基本概念,babel 使用 ,eslint 使用 以及新语法的介绍 和使用经验 ECMAScript 概念 ECMASctipt 是一种由 Ecma (前身为欧洲计算 ...

  5. java网络考试系统的设计与实现 jsp 源码

    开发环境: Windows操作系统开发工具:MyEclipse/Eclipse + JDK+ Tomcat + MySQL 数据库 项目简介: 网络考试系统主要用于实现高校在线考试,基本功能包括:自动 ...

  6. MyBatis从入门到精通(第4章):MyBatis动态SQL【foreach、bind、OGNL用法】

    (第4章):MyBatis动态SQL[foreach.bind.OGNL用法] 4.4 foreach 用法 SQL 语句中有时会使用 IN 关键字,例如 id in (1,2,3).可以使用 ${i ...

  7. placeholder在IE下的兼容问题

    最近写项目要求兼容到ie8,写完了去ie测试的时候,发现了placeholder在ie下的兼容问题,为了解决,搜罗网上各种牛人的解决方案,自己总结如下: css样式(设置各浏览器下placeholde ...

  8. 是时候写个自己的dialog了

    组件下载地址:http://pan.baidu.com/s/1pJFVfej 最近做的项目需要用到对话框,但是原生的弹出框你是知道的.如果有时间,还是自己尝试一下,也是可以的. 一个简单图 里面的输入 ...

  9. CCPC2019网络赛

    2019中国大学生程序设计竞赛(CCPC) - 网络选拔赛 A 题意:找到最小的正整数 C 使得 (A^C)&(B^C) 最小. \(A,B \le 10^9\) 签到题.这个C取 A& ...

  10. \_\_getattribute\_\_

    __getattribute__ 一.__getattr__ 不存在的属性访问,触发__getattr__ class Foo: def __init__(self, x): self.x = x d ...