我正在研究一些碰撞信号为SIGSEGV的几次崩溃,原因是SEGV_ACCERR。在搜索SEGV_ACCERR之后,我发现最接近人类可读解释的是:对象的无效权限
这在更一般意义上意味着什么?何时出现SEGV_ACCERR?是否有关于这个原因的更具体的文件?
答案 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
上;大概是在更高的优化级别上对临时对象进行了优化。