Iphone iOS崩溃日志中的异常类型

Iphone iOS崩溃日志中的异常类型,iphone,objective-c,ios,exception,crash-reports,Iphone,Objective C,Ios,Exception,Crash Reports,自从我开始学习iOS开发以来,我已经看到了几种不同类型的崩溃日志 我知道: 异常类型:EXC\u BAD\u访问(SIGSEGV)表示我们正在访问已发布的对象 但不知道: 异常类型:EXC\u坏访问(SIGBUS) 异常类型:EXC_崩溃(SIGABRT) 异常类型:EXC_断点(SIGTRAP) 你知道iOS崩溃日志中有多少种异常类型,它们是什么意思吗 我知道:异常类型:EXC_BAD_ACCESS(SIGSEGV)表示我们正在访问一个已发布的对象 否。 SIGSEGV是一种分段错误,意味着您

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

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

但不知道:
异常类型:EXC\u坏访问(SIGBUS)
异常类型:EXC_崩溃(SIGABRT)
异常类型:EXC_断点(SIGTRAP)

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

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

否。

SIGSEGV是一种分段错误,意味着您试图访问无效的内存地址

这些异常(事实上,它们是信号)与Objective-C无关,而是与C有关。 因此,您可以在没有Objective-C对象的情况下获得这样的异常

请注意,信号不是例外,这意味着您不能用
@try
@catch
块捕捉它们

您可以使用
signal
sigaction
功能设置信号处理程序。请记住一些信号,如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非常相似,区别在于硬件级别(通常是尝试访问一个确实存在但您不拥有的地址与尝试访问一个背后没有任何东西但不是严格定义的地址之间的区别),但通常与相同类型的错误相关联,虽然SIGBUS比SIGSEGV更可能使用未初始化的变量

如果您试图映射到您在Objective-C中可能犯的错误,您可能只想将SIGSEGV和SIGBUS一起理解为“我无权进行的内存访问”

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


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

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


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

EXC\u坏访问(SIGSEGV)
EXC\u坏访问(SIGBUS)

我们的程序很可能试图访问一个坏的内存位置或地址是好的,但我们没有访问它的特权。由于内存压力,内存可能已解除分配

EXC\u断点(SIGTRAP)

这是由于(可能由库代表我们)提出了
NSException
,或调用了
\NSLockError
objc\u exception\u throw
。例如,这可以是检测异常的Swift环境,例如强制展开nil选项

执行错误指令(SIGILL)

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

EXC\u-GUARD


此时程序关闭了一个受保护的文件描述符。系统使用的SQLite数据库就是一个例子。

提供的示例不会在xcode6.1ARC中引发异常,第一个示例现在明确合法<代码>视图被隐式初始化为
nil
,消息传递总是安全的。尝试将其设置为随机地址。我现在在iPad上;将在我使用真正的键盘时进行编辑。SIGTRAP与调试器无关。根据规范,出现异常时会发生这种情况,如果应用程序在调试器中运行,则会触发调试器断点。如果它没有在调试器中运行,它只会终止。在Swift中,它要么试图打开一个为零的可选项,要么是一个无效的力转换。