EXC_BAD_ACCESS中的code参数是什么意思?

7

我在iOS上使用Objective C已经有一个月了,但之前有很多C++的经验。

我的理解是EXC_BAD_ACCESS本质上相当于Segmentation Fault,即尝试访问不允许的内存区域。但奇怪的是,在崩溃的iOS应用程序中,我还看到过SIGSEGV。我注意到这个异常中有一个代码参数(例如code=1),我想知道那个代码具体是什么意思。

我在谷歌上搜索了一下,似乎找不到关于这个错误的正式文档,显然我并不孤单。 有人知道这里的代码参数是什么意思吗?

1个回答

7

如果你查看在你的设备上生成的崩溃日志,你会看到:

Exception Type:  EXC_BAD_ACCESS (SIGSEGV)
Exception Codes: KERN_INVALID_ADDRESS at <some address>

如果您需要进一步了解与异常相关的code参数的描述,可以参考usr/include/mach/kern_return.h。它提供了相对易读的常量名称以及与常量值相关联的简短注释。

打开该文件的最快方式是在Xcode文件中键入常量KERN_INVALID_ADDRESS并选择“跳转到定义”。 ;)

FYI:code=1直接关联到KERN_INVALID_ADDRESS。与此常量相关联的注释为:

/* Specified address is not currently valid. */

非常感谢。我认为苹果公司也应该在他们的文档中记录这个。 - Joey Carson
我认为他们唯一合理的记录此事的地方应该是在他们的Mach内核文档中...这个文档从一个名为Keep Out的页面开始。 - Ian MacDonald
让开发人员避免编写内核空间代码是有道理的,但这与用户空间应用程序与内核空间的交互有关。我认为操作系统API和返回值的正确解释应该得到充分记录。 - Joey Carson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接