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
块来捕捉它们。
您可以使用signal
和sigaction
函数设置信号处理程序。 请记住一些信号,如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
, 这是一个输出示例 。 对不起,没有发布在这里,但控制台输出的格式是可怕的。
来源和更多关于信号的信息