博客> iOS Crash 小记
iOS Crash 小记
2018-07-12 05:18 评论:0 阅读:371 一一一一一
crash signal

iOS Crash 杀手排名:http://www.cocoachina.com/ios/20170122/18602.html

iOS崩溃Crash解析:http://devma.cn/blog/2016/11/10/ios-beng-kui-crash-jie-xi/

iOS应用崩溃日志分析:http://www.cocoachina.com/industry/20130725/6677.html

导致iOS崩溃的最常见5大元凶

SIGPIPE信号处理整理:https://my.oschina.net/moooofly/blog/474604

  • 1,NSInvalidArgumentException 异常:

    a,###NSDictionary插入nil的对象 当 NSDictionary 遇见 nil 崩溃原因可能是在转换成NSDictionary的过程中有nil对象插入从而导致crash

    解决方案: 把空值nil转换成NSNull对象,利用Object-C的runtime可以不用改动现有代码来解决问题。利用 runtime的Swizzle Method把nil对象转换成NSNull对象就可以把问题解决了,

    实现方案: 创建一个NSDictionary的类别,利用runtime的Swizzle Method来替换系统的方法,源码实现可以参考Glow团队封装的NSDictionary+NilSafe(Github上可下载到)

    b,###NSJSONSerialization序列化的时候,传入data为nil : data parameter is nil:NSJSONSerialization序列化的时候,传入data为nil,造成的崩溃。

    解决: 在序列化的时候,统一加入判断,判断data是不是nil即可

    c,### an unrecognized selector 无法识别的方法: 就是一个类调用了一个不存在的方法,造成的崩溃,解决这样的问题,可以在写一个方法的时候,判断一下其类的类型,不符合类型的不让其调用,也可以使用runtime对常见的方法调用做一下错误兼容。

  • 2,SIGSEGV 异常 (好像没见过,或者不认识)

    iOS异常捕获——处理signal:http://www.iosxxx.com/blog/2015-08-29-iosyi-chang-bu-huo.html 2.1, SIGSEGV是当SEGV发生的时候,让代码终止的标识。当去访问没有被开辟的内存或者已经被释放的内存时,就会发生这样的异常。另外,在低内存的时候,也可能会产生这样的异常。

    解决方案:
    Leaks分析; facebook提供的自动化工具来监测内存泄漏问题;

    2.2, Can't add self as subview crash: 造成这个崩溃的原因,一种原因是在push或pop一个视图的时候,并且设置了animated:YES,如果此时动画(animated)还没有完成,这个时候,你在去push或pop另外一个视图的时候,就会造成该异常,或者有[self.view addSubview:self.view];

    解决方案: 把animated设置为NO; 通过runtime来进行实现了,通过安全的方式,确保当有控制器正在进行入栈或出栈时,没有其他入栈或出栈操作;

  • 3,NSRangeException异常

    数组越界; 字符串截取越界;

    解决方案: 判断长度 利用runtime的Swizzle Method特性(不需要修改现有的代码,对现有代码的侵入性降低到最低,不需要添加大量重复的逻辑判断代码)

  • 4,SIGPIPE 异常

    对一个端已经关闭的socket调用两次write,第二次write将会产生SIGPIPE信号,该信号默认结束进程

    解决方案:

    _ 对于iOS系统来说,只需要把下面这段代码放在.pch文件中即可 //// 仅在 IOS 系统上支持 SO_NOSIGPIPE

    //#if defined(SO_NOSIGPIPE) && !defined(MSG_NOSIGNAL)
    
    //// We do not want SIGPIPE if writing to socket.
    
    //    const int value = 1;
    
    //    setsockopt(fd, SOL_SOCKET, SO_NOSIGPIPE, &value, sizeof(int));
    
    //#end if
    
    ////_

  • 5,SIGABRT 异常

    这是一个让程序终止的标识,会在断言、app内部、操作系统用终止方法抛出。通常发生在异步执行系统方法的时候。如CoreData、NSUserDefaults等,还有一些其他的系统多线程操作。

  • Signal信号的类型:

    SIGABRT–程序中止命令中止信号

    SIGALRM–程序超时信号

    SIGFPE–程序浮点异常信号

    SIGILL–程序非法指令信号

    SIGHUP–程序终端中止信号

    SIGINT–程序键盘中断信号

    SIGKILL–程序结束接收中止信号

    SIGTERM–程序kill中止信号

    SIGSTOP–程序键盘中止信号 

    SIGSEGV–程序无效内存中止信号

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

    SIGPIPE–程序Socket发送失败中止信号

收藏
0
sina weixin mail 回到顶部