it-swarm.cn

IOS崩溃日志中的异常类型

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

我知道: 异常类型:EXC_BAD_ACCESS(SIGSEGV) 表示我们正在访问已发布的对象。

但不知道:
例外类型:EXC_BAD_ACCESS(SIGBUS)
例外类型:EXC_CRASH(SIGABRT)
例外类型:EXC_BREAKPOINT(SIGTRAP)

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

49
Tuyen Nguyen

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

不 -

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

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

请注意,信号不是例外,这意味着您无法使用@try@catch块捕获它们。

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

如果您想了解更多信息,可以查看 Wikipedia 页面中的信号。

那说,恢复:

_ sigsegv _(分段错误)

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

_ sigbus _(总线错误)

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

_ sigfpe _(浮点异常)

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

_ sigpipe _

破管。

_ sigill _

非法处理器指令。

_ sigtrap _

调试器相关

_ sigabrt _

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

96
Macmade

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

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

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

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

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

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

SIGABRT是一个试图中止自身的程序,因此通常意味着某种内部一致性检查失败了。例如,如果你尝试两次释放相同的内存,或者 - 在Cocoa级别 - 如果你raise没有被捕获的NSException,则会引发SIGABRT。如果你得到一个SIGABRT,那你就做错了系统软件检测到的东西(与硬件中出现的SEGV和BUS相反)。

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

29
Tommy

这些消息来自gdb,它们不是objective-C的唯一消息。要获取有关信号的信息,您只需在调试器控制台输入info signals这是一个示例输出 。很抱歉没有在这里发布,但控制台输出的格式很糟糕。

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

4
Youssef

我最近研究了这个主题领域,这是我的总结:

EXC_BAD_ACCESS (SIGSEGV)EXC_BAD_ACCESS (SIGBUS)

我们的程序很可能试图访问错误的内存位置或地址很好,但我们没有权限访问它。由于内存压力,内存可能已被释放。

EXC_BREAKPOINT (SIGTRAP)

这是由于NSException被引发(可能由我们代表的库)或_NSLockErrorobjc_exception_throw被调用。例如,这可以是检测异常的Swift环境,例如强制展开nil可选。

EXC_BAD_INSTRUCTION (SIGILL)

这是程序代码本身出错的时候,而不是它可能访问的内存。这在iOS设备上应该很少见;也许是编译器或优化器错误,或者有缺陷的手写汇编代码。在模拟器上,它是一个不同的故事,因为使用未定义的操作码是Swift运行时用来停止访问僵尸对象(解除分配的对象)的技术。

EXC_GUARD

这是程序关闭被保护的文件描述符的时候。一个例子是系统使用的SQLite数据库。

1
Faisal Memon