iOS崩溃日志中的异常类型

Tuy*_*yen 49 iphone exception objective-c crash-reports ios

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

我知道: 异常类型:EXC_BAD_ACCESS(SIGSEGV)意味着我们正在访问一个已发布的对象.

但不知道:
异常类型:EXC_BAD_ACCESS(SIGBUS)
异常类型:EXC_CRASH(SIGABRT)
异常类型:EXC_BREAKPOINT(SIGTRAP)

你知道iOS崩溃日志中有多少异常类型,它们是什么意思?

Mac*_*ade 96

我知道:异常类型:EXC_BAD_ACCESS(SIGSEGV)意味着我们正在访问一个已发布的对象.

没有.

SIGSEGV是一个分段错误,这意味着您正在尝试访问无效的内存地址.

这些异常(事实上,它们是信号)与Objective-C无关,但是C.所以你可以在没有Objective-C对象的情况下得到这样的异常.

请注意,信号不是例外,这意味着您无法捕获它们@try@catch阻塞它们.

您可以使用signalsigaction函数设置信号处理程序.请记住一些信号,如SIGABRT无法阻止.

如果您想了解更多信息,可以查看有关信号的维基百科页面.

那说,恢复:

SIGSEGV(分段错误)

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

SIGBUS(总线错误)

访问无效的内存地址.地址不存在,或者对齐无效.

SIGFPE(浮点异常)

算术运算无效.尽管有名称,但可以与整数运算相关.

SIGPIPE

破管.

SIGILL

非法处理器指令.

SIGTRAP

调试器相关

SIGABRT

程序崩溃,与前面的信号无关.

  • SIGTRAP与调试器无关.根据规范,当出现异常时会发生这种情况,如果应用程序在调试器中运行,则会触发调试器断点.如果它没有在调试器中运行,它就会终止.在Swift中,它要么试图打开一个nil的可选项,要么是无效的力转换. (6认同)

Tom*_*mmy 30

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

UIView *view; // uninitialised, could point to anything
[view setFrame:someFrame];
Run Code Online (Sandbox Code Playgroud)

甚至只是在C级非对象内容中出错,例如:

int array[100];
array[1000] = 23; // out-of-bounds access
Run Code Online (Sandbox Code Playgroud)

SIGBUS与SIGSEGV非常相似,不同之处在于硬件级别(通常是尝试访问存在的地址但您不拥有的地址与尝试访问其后面没有任何内容的地址之间的区别,但是这不是一个严格的定义),但通常与相同类型的错误相关联,尽管SIGBUS更可能与未初始化的变量而不是SIGSEGV.

如果你试图映射到你可能在Objective-C中做出的错误,你可能只想把SIGSEGV和SIGBUS一起读作意思是"我没有权利做出的内存访问".

SIGABRT是一个试图中止自身的程序,因此通常意味着某种内部一致性检查失败了.在可可的水平- -如果你举例来说,如果你试图释放同一内存的两倍,或SIGABRT引发raiseNSException未捕获.如果你得到一个SIGABRT,你这样做是由系统软件(相对于SEGV和BUS,所出现的硬件)检测到一些错误.

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