iOS崩溃日志中的exceptiontypes

自从我开始学习iOS开发以来,我已经看到了几种不同types的崩溃日志。

我知道: exceptiontypes:EXC_BAD_ACCESS(SIGSEGV)意味着我们正在访问一个释放的对象。

但不知道:
exceptiontypes:EXC_BAD_ACCESS(SIGBUS)
exceptiontypes:EXC_CRASH(SIGABRT)
例外types:EXC_BREAKPOINT(SIGTRAP)

你知道iOS崩溃日志中有多less个exceptiontypes,它们是什么意思?

我知道:exceptiontypes:EXC_BAD_ACCESS(SIGSEGV)意味着我们正在访问一个释放的对象。

没有。

SIGSEGV是一个分段错误,意思是你试图访问一个无效的内存地址。

那些exception(实际上它们是信号)与Objective-C没有关系,只是C。所以你可以在没有Objective-C对象的情况下得到这样的exception。

请注意,信号不是一个例外,这意味着你不能用@try@catch块来捕捉它们。

您可以使用signalsigaction函数设置信号处理程序。 请记住一些信号,如SIGABRT不能被阻止。

如果你想了解更多的信息,你可以查看维基百科关于信号的页面。

这就是说,恢复:

SIGSEGV (分段错误)

访问无效的内存地址。 该地址存在,但您的程序无法访问它。

SIGBUS (总线错误)

访问无效的内存地址。 地址不存在,或alignment无效。

SIGFPE (浮点exception)

算术运算无效。 尽pipe名称可以与整数运算相关。

SIGPIPE

pipe道破损。

SIGILL

非法的处理器指令。

SIGTRAP

debugging器相关

SIGABRT

程序崩溃,与之前的信号无关。

SIGSEGV字面意思是你正在访问你不拥有的地址。 所以你不一定要访问一个发布的对象; 您可能正在访问一个从未存在的对象,如下所示:

 UIView *view; // uninitialised, could point to anything [view setFrame:someFrame]; 

甚至只是在C级别的非对象的东西,如:

 int array[100]; array[1000] = 23; // out-of-bounds access 

SIGBUS与SIGSEGV非常相似,区别在于硬件级别上(通常是试图访问一个存在的地址,但不是你自己的地址,并试图访问一个没有任何东西的地址,但是这不是一个严格的定义),但通常与相同types的错误相关联,虽然一个SIGBUS更可能是一个未初始化的variables而不是一个SIGSEGV。

如果你想映射到你可能在Objective-C中犯的错误,那么你可能只想读一下SIGSEGV和SIGBUS,意思是“我没有权限访问内存”。

SIGABRT是一个试图放弃自己的程序,所以通常意味着某种内部一致性检查失败了。 例如,如果您尝试释放两次相同的内存,或者在Cocoa级别,如果raise了一个未捕获的NSException ,则会raise NSException 。 如果你得到一个SIGABRT,你做了一些系统软件检测到的错误(与硬件中出现的SEGV和BUS相反)。

SIGTRAP是从程序调用debugging器。 有趣的是,当你做错了可以在软件中检测到的东西时,苹果似乎会使用这些东西,但是与环境有关,而不是你的特定代码。 因此,例如,您可以调用您使用的SDK中存在的C函数,但不要使用您正在运行的设备上的C函数(例如,当您使用较低的部署目标来构build最新的SDK时),或者执行类似的操作一个东西。

这些消息来自gdb,它们不是唯一的objective-C。 要获得有关信号的信息,您只需在debugging器控制台inputinfo signals , 这是一个输出示例 。 对不起,没有发布在这里,但控制台输出的格式是可怕的。

来源和更多关于信号的信息