SEGV_ACCERR是什么意思?

时间:2013-10-01 15:16:14

标签: c++ objective-c c signals

我正在研究一些碰撞信号为SIGSEGV的几次崩溃,原因是SEGV_ACCERR。在搜索SEGV_ACCERR之后,我发现最接近人类可读解释的是:对象的无效权限

这在更一般意义上意味着什么?何时出现SEGV_ACCERR?是否有关于这个原因的更具体的文件?

4 个答案:

答案 0 :(得分:15)

这是我在64位iOS设备上看到的错误,如果多个线程在ARC下读取并更改变量,则会发生这种错误。例如,我今天修复了一个崩溃,其中多个后台线程正在读取并使用静态NSDate和NSString变量并更新它们而不进行任何类型的锁定或排队。

在多个线程上使用核心数据对象也会导致此崩溃,正如我在崩溃日志中多次看到的那样。

我也使用Crittercism,这个特殊的崩溃是一个只影响64位设备的SEGV_ACCERR。

答案 1 :(得分:1)

在代码尝试从“text”以外的地方执行的情况下,我见过这种情况。

例如,如果指针指向堆或堆栈中的函数并且您尝试执行该代码(来自堆或堆栈),则CPU会抛出此异常。

答案 2 :(得分:1)

sigaction 的手册页所述, SEGV_ACCERR 是SIGSEGV的信号代码,它指定映射对象的无效权限。与SEGV_MAPERR表示地址未映射到有效对象相反,SEGV_ACCERR表示该地址与一个对象匹配,但请确保该地址既不是好对象,也不是允许该进程访问的对象。

答案 3 :(得分:1)

由于堆栈溢出,有可能获得SEGV_ACCERR。具体来说,这是我在Android ARM64上发生的以下情况:

VeryLargeStruct s;
s = {}; // SEGV_ACCERR

似乎零初始化创建了一个临时事件,导致堆栈溢出。这只发生在-O0上;大概是在更高的优化级别上对临时对象进行了优化。