ios中的奇怪崩溃Signal和EXC_BAD_ACCESS错误分析

什么是Signal

在计算机科学中,信号(英语:Signals)是Unix、类Unix以及其他POSIX兼容的操作系统中进程间通讯的一种有限制的方式。它是一种异步的通知机制,用来提醒进程一个事件已经发生。当一个信号发送给一个进程,操作系统中断了进程正常的控制流程,此时,任何非原子操作都将被中断。如果进程定义了信号的处理函数,那么它将被执行,否则就执行默认的处理函数。

在iOS中就是未被捕获的Objective-C异常(NSException),导致程序向自身发送了SIGABRT信号而崩溃。

Signal信号的类型

SIGABRT–程序中止命令中止信号
SIGALRM–程序超时信号
SIGFPE–程序浮点异常信号
SIGILL–程序非法指令信号
SIGHUP–程序终端中止信号
SIGINT–程序键盘中断信号
SIGKILL–程序结束接收中止信号
SIGTERM–程序kill中止信号
SIGSTOP–程序键盘中止信号
SIGSEGV–程序无效内存中止信号
SIGBUS–程序内存字节未对齐中止信号
SIGPIPE–程序Socket发送失败中止信号
iOS异常捕获这篇文章中有对各种信号的解释。

SIGABRT

就crash而言,SIGABRT是一个比较好解决的,因为他是一个可掌控的crash。App会在一个目的地终止,因为系统意识到app做了一些他不能支持的事情。

通常, SIGABRT 异常是由于某个对象接收到未实现的消息引起的。 或者,用简单的话说,在某个对象上调用了不存在的方法。

SIGSEGV

SIGSEGV程序无效内存中止信号,一般是表示内存不合法,

SIGBUS

SIGBUS程序内存字节未对齐中止信号,

截取Signal和Exception从容的崩溃

一个不错的崩溃远吗,集成到项目中能捕获崩溃信息 DSSignalHandlerDemo
这是一个防止奔溃的源码,可以使一些原本会奔溃的操作弹出UIAlertView。里面写了两种信号量的崩溃:SIGSEGV、SIGABRT,还有一些信号大家可以写上去提个PR给我。

下图为源码的运行图,其中Signal中的Signal(EGV)第一次点击的时候能弹出alert,如果第二次点击就没有崩溃和alert,感觉像卡死一样。

而Signal(BRT)中的这种信号错误多次点击也是没有问题的还是能继续下去。个人猜测可能是SIGSEGV这种信号错误会导致了整个进程挂了。

注意:测试的时候如果测试Signal类型的崩溃,不要在xcode下的debug模式进行测试。因为系统的debug会优先去拦截。应该build好应用之后直接点击运行app进行测试。

时间: 2024-10-15 09:24:42

ios中的奇怪崩溃Signal和EXC_BAD_ACCESS错误分析的相关文章

iOS 中捕获程序崩溃日志

iOS开发中遇到程序崩溃是很正常的事情,如何在程序崩溃时捕获到异常信息并通知开发者,是大多数软件都选择的方法.下面就介绍如何在iOS中实现: 1. 在程序启动时加上一个异常捕获监听,用来处理程序崩溃时的回调动作  NSSetUncaughtExceptionHandler (&UncaughtExceptionHandler);  官方文档介绍:Sets the top-level error-handling function where you can perform last-minute

iOS中 iOS10 权限崩溃问题 韩俊强的CSDN博客

iOS10 权限崩溃问题 每日更新关注:http://weibo.com/hanjunqiang  新浪微博! 今天 手机升级了 iOS10 Beta,然后用正在开发的项目 装了个ipa包,发现点击有关 权限访问 直接Crash了,并在控制台输出了一些信息: This app has crashed because it attempted to access privacy-sensitive data without a usage description.  The app's Info.

Xcode崩溃问题调试 signal SIGABRT&EXC_BAD_ACCESS

在进行app开发过程中会遇到很多的问题,各种崩溃令人相当头疼.当然,解决bug的能力也体现了一个程序员的水平,现在来说一说开发中经常遇到的崩溃问题吧. 常见崩溃问题: 一是signal SIGABRT, 二是EXC_BAD_ACCESS. 一.signal SIGABRT 出现这样的崩溃一般有两个原因:1. 数组越界 输入: NSArray *array = [NSArray arrayWithObject:@"0"]; NSString *str = [array objectAtI

iOS中崩溃调试的使用和技巧总结 韩俊强的博客

每日更新关注:http://weibo.com/hanjunqiang  新浪微博 在iOS开发调试过程中以及上线之后.程序经常会出现崩溃的问题.简单的崩溃还好说,复杂的崩溃就须要我们通过解析Crash文件来分析了,解析Crash文件在iOS开发中是比較常见的. 如今网上有非常多关于解析崩溃信息的博客.可是大多质量參差不齐,或者有些细节没有注意到.今天写一篇博客总结一下我对崩溃调试的使用和技巧,假设有哪些错误或遗漏.还请指点.谢谢. 获取崩溃信息 在iOS中获取崩溃信息的方式有非常多,比較常见的

iOS 中 UIView 和 CALayer 的关系

UIView 有一个名叫 layer ,类型为 CALayer 的对象属性,它们的行为很相似,主要区别在于:CALayer 继承自 NSObject ,不能够响应事件. 这是因为 UIView 除了负责响应事件 ( 继承自 UIReponder ) 外,它还是一个对 CALayer 的底层封装.可以说,它们的相似行为都依赖于 CALayer 的实现,UIView 只不过是封装了它的高级接口而已. 那 CALayer 是什么呢? CALayer(图层) 文档对它定义是:管理基于图像内容的对象,允许

iOS中的通知(NSNotification)

iOS中的通知(NSNotification) 前言 通知中心是一个单例.通知在iOS中是一种设计模式.每一个应用程序都有一个通知中心NSNotificationCenter实例, 专门负责协助不同对象之间的消息通信. 任何一个对象都可以向通知中心发布NSNotification, 描述自己在做什么,而任何注册了该通知的对象该特定通知发布的时候会收到这个通知. 获取通知中心对象 通过下面的方式来获取通知中心对象: 1 2 3 NSNotificationCenter *center = [NSN

iOS中内存管理

iOS中创建对象的步骤: 1,分配内存空间,存储对象 2,初始化成员变量 3,返回对象的指针地址 第一:非ARC机制: 1,对象在创建完成的同时,内部会自动创建一个引用计数器,是系统用来判断是否回收对象的唯一标示,当我们的应用计数retainCount = 0的时候,系统会回收当前对象2,[对象 release] retainCount - 1:3,[对象 retain] retailCount + 1:4,当应用计数retailCount = 0的对象就会被销毁; 5,dealloc函数,当一

善用iOS中webview(转)

iOS开发中webview和native code写这是一件纠结的事?我写这篇文章, 介绍一下我做iOS两年来总结的一些在webview和native code的配合上的一些经验和技巧,当然,都是基于互联网App的,希望对大家有所帮助. 首先提两句两者的优劣?webview与运维成本低, 更新几乎不依赖App的版本:但在交互和性能上与跟native code有很大差距.native code与之对应. 注,我这里不说HTML5,因为我认为,HTML5确实给web带入了一个新时代.这个时代是什么,

ios中的几种多线程实现

iOS 支持多个层次的多线程编程,层次越高的抽象程度越高,使用起来也越方便,也是苹果最推荐使用的方法.下面根据抽象层次从低到高依次列出iOS所支持的多线程编程范式:1, Thread;2, Cocoa operations;3, Grand Central Dispatch (GCD) (iOS4 才开始支持)下面简要说明这三种不同范式:Thread 是这三种范式里面相对轻量级的,但也是使用起来最负责的,你需要自己管理thread的生命周期,线程之间的同步.线程共享同一应用程序的部分内存空间,它