iOS - libc++abi.dylib: terminate_handler unexpectedly threw an exception

时间:2022-01-12 14:43:19

代码出现crash,报错:libc++abi.dylib: terminate_handler unexpectedly threw an exception

当我们很明确是某一块代码执行导致了错误,不妨使用try catch来打印exception详情。

例如:

@try {
        self.headerlineLable.text = [_entity.name substringToIndex:]?:@"Power by Wieye";
        self.headerlineLable.font = Font_Heiti(kCF_TAB);
    }
    @catch (NSException *exception) {
        NSLog(@"exception:%@",exception);
    }

打印结果:

exception:*** -[__NSCFString substringToIndex:]: Index  

我们知道了问题,问题是因为我想保留字符串前16个索引,但现在传递过来的字符串是13个索引。索引越界了。然后崩溃了~

今天是1月26日,出现了这样的错误,我需要重新编辑一下处理方法:

libc++abi.dylib: terminate_handler unexpectedly threw an exception

分析摘自:http://www.itnose.net/detail/6196671.html

   现在唯一的信息点是libc++abi.dylib,这个库到底是做什么的?从后缀看,是一个动态库,那么会不会是因为发生了一些动态错误? 而按经验来看,一般的动态错误基本是因为动态类型错误引起,在object-c语言中,会发生动态类型错误的可能基本存在于不可变类型与可变类型之间的转换,那么我们的查错范围将优先限制在不可变类型与可变类型转换上,是否我们对一个不可变类型进行了修改操作?当然,编译器没有那么傻,如果直接对一个不可变类型进行修改操作,是会直接报错的,那么就剩下另一种可能,程序将一个不可变类型赋值给可变类型,然后对可变类型进行了修改操作,这样可以通过静态检查,但是动态运行的时候,就会发生类型错误。基于以上分析,我们可以跟踪断点,会发现程序在对mutable对象进行add、set等操作时挂掉,而这个对象实际上赋值的是一个不可变对象。常见的情况是把一个NSArray对象赋值给一个NSMutableArray对象,然后进行了delete、add等修改操作,或者把一个NSDictionary对象赋值给一个NSMutableDictionary对象,然后进行了set等操作。

提示:如果出现这样的问题,大都是数组越界之类的。