iOS crash分类

iOS crash分类

OC Exception

Objective-C层的异常。

捕获方法:通过NSSetUncaughtExceptionHandler来设置处理器。

Mach Exception

捕获方法:task_set_exception_ports() 创建子线程、创建异常监听端口。

系统内核(mach)层面的异常。
最终转成SIGABRT。
总结几个常见的Mach异常(Exception Type , Exception Code):

Exception Type
EXC_BAD_ACCESS (Bad Memory Access)
此类型的exception是我们最长碰到的Crash,通常用于访问了不该访问的内存导致。一般EXC_BAD_ACCESS后面的“()”还会带有补充信息。

SIGSEGV:通常由于重复释放对象导致,这种类型在ARC以后比较少见了
SIGABRT:收到Abort信号推出,通常Foundation库中的容器为了保护状态正常会做一些检测,例如插入nil到数组中会出现此错误。
SEGV:代码无效内存地址,比如空指针,未初始化指针,栈溢出等
SIGBUS:总线错误,访问对象为初始化。与SIGSEGV不同的是,SIGSEGV访问的是无效地址,而此访问的是有效地址,但是总线访问异常(如地址对齐问题)
SIGILL:尝试执行非法的指令,可能不被识别或者没有权限

EXC_BAD_INSTRUCTION
此类异常通常由于线程执行非法指令导致

EXC_ARITHMETIC
除零错误会抛出此类异常

Exception Code
0x8badf00d 读作“ate bad food”,程序启动或者恢复时间过长被watch dog终止。
0xdead10cc 读作“dead lock” 表示应用因为在后台运行时占用系统资源,如通讯录数据库不释放而被终止。
0xbad22222 该编码表示 VoIP 应用因为过于频繁重启而被终止。
0xdeadfa11 读做 “dead fall”! 该代码表示应用是被用户强制退出的。根据苹果文档, 强制退出发生在用户长按开关按钮直到出现 “滑动来关机”, 然后长按 Home按钮。强制退出将产生 包含0xdeadfa11 异常编码的崩溃日志, 因为大多数是强制退出是因为应用阻塞了界面。
0xbaaaaaad ⽤用户按住Home键和⾳音量键,获取当前内存状态,不代表崩溃
0xc00010ff 读作“cool off” 因为太烫了被干掉

Unix Signal

unix signal和mach exception其实是同一份异常在不同层次的处理。

SIGABRT–程序中止命令中止信号
SIGALRM–程序超时信号
SIGFPE–程序浮点异常信号
SIGILL–程序非法指令信号
SIGHUP–程序终端中止信号
SIGINT–程序键盘中断信号
SIGKILL–程序结束接收中止信号
SIGTERM–程序kill中止信号
SIGSTOP–程序键盘中止信号
SIGSEGV–程序无效内存中止信号
SIGBUS–程序内存字节未对齐中止信号
SIGPIPE–程序Socket发送失败中止信号

捕获方法1:

    signal(SIGHUP, SignalExceptionHandler);
    signal(SIGINT, SignalExceptionHandler);
    signal(SIGQUIT, SignalExceptionHandler);

    signal(SIGABRT, SignalExceptionHandler);
    signal(SIGILL, SignalExceptionHandler);
    signal(SIGSEGV, SignalExceptionHandler);
    signal(SIGFPE, SignalExceptionHandler);
    signal(SIGBUS, SignalExceptionHandler);
    signal(SIGPIPE, SignalExceptionHandler);

捕获方法2:
iOS crash分类_第1张图片

C++ Exception

捕获方法:std::set_terminate

你可能感兴趣的:(iOS)