iOS crash原因分析

1、SIGSEGV

#2284 SIGSEGV
 segmentation violation 

SIG 是信号名的通用前缀, SEGV 是 segmentation violation 的缩写.
在 POSIX 兼容的平台上,SIGSEGV 是当一个进程执行了一个无效的内存引用,或发生段错误时发送给它的信号。SIGSEGV 的符号常量在头文件 signal.h 中定义。因为在不同平台上,信号数字可能变化,因此符号信号名被使用。通常,它是信号11。
对于不正确的内存处理,如当程序企图访问 CPU 无法定址的内存区块时,计算机程序可能抛出 SIGSEGV。操作系统可能使用信号栈向一个处于自然状态的应用程序通告错误,由此,开发者可以使用它来调试程序或处理错误。
在一个程序接收到 SIGSEGV 时的默认动作是异常终止。这个动作也许会结束进程,但是可能生成一个核心文件以帮助调试,或者执行一些其他特定于某些平台的动作。
SIGSEGV可以被捕获。也就是说,应用程序可以请求它们想要的动作,以替代默认发生的动作。这样的动作可以是忽略它、调用一个函数,或恢复默认的动作。在一些情形下,忽略 SIGSEGV 导致未定义行为。
一个应用程序可能处理SIGSEGV的例子是调试器,它可能检查信号栈并通知开发者目前所发生的,以及程序终止的位置。
SIGSEGV通常由操作系统生成,但是有适当权限的用户可以在需要时使用kill系统调用或kill命令(一个用户级程序,或者一个shell内建命令)来向一个进程发送信号。
在 POSIX 兼容的平台上,SIGSEGV 是当一个进程执行了一个无效的内存引用,或发生段错误时发送给它的信号。SIGSEGV 的符号常量在头文件 signal.h 中定义。因为在不同平台上,信号数字可能变化,因此符号信号名被使用。通常,它是信号11。

2、NSInvalidArgumentException

#2332 NSInvalidArgumentException
*** -[__NSPlaceholderDictionary initWithObjects:forKeys:count:]: attempt to insert nil object from objects[1]
Spring3G -[MWUncaughtExceptionHandler saveCrashToFile:]

使用category时有可能出现崩溃,因为category没有被链接进APP

解决办法:

1. sdk
(1). 如果是三方SDK或者自己的工程,则修改配置,"Building Settings" -> "Linking" -> "Other Linker Flags" 添加"-ObjC"
(2). 如果是自己开发的SDK,在修改 "Building Settings" -> "Linking" -> "Preform Single-Object Prelink"为"YES".使用SDK的APP就不需要做任何修改了

2. 对象被提前释放
大部分情况下是因为对象被提前release了,在你心里不希望他release的情况下,指针还在,对象已经不在了。
解决办法:检查对象的引用计数的正确性

3.方法没有实现
在我们开发过程中,经常修改方法名,可能出现.h文件里修改,但是.m文件里没有修改,导致没有对应的实现。

3、NSGenericException

#48 NSGenericException(SIGABRT)
*** Collection <__NSCFDictionary: 0x12601fb90> was mutated while being enumerated.
CoreFoundation ___exceptionPreprocess
A generic name for an exception.

You should typically use a more specific exception name.
通用异常,当没有指定特定类型异常时会抛出通用异常。
You should typically use a more specific exception name.
通用异常,当没有指定特定类型异常时会抛出通用异常。

注:本文摘抄于bugly

你可能感兴趣的:(iOS crash原因分析)