我在 android 中看到了这两个分段错误。一个说 SEGV_MAPERR,另一个说 SEGV_ACCERR。
你能告诉我这两个有什么区别吗?
signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 41963214
signal 11 (SIGSEGV), code 2 (SEGV_ACCERR), fault addr 4006e000
谢谢。
SEGV_MAPERR 表示您试图访问一个不映射到任何东西的地址。
SEGV_ACCERR 表示您试图访问您无权访问的地址。
因此,在这两种情况下,您都访问了您不应该拥有的地址,这可能是您的实际代码唯一有罪的地方。在前一种情况下,该地址范围内无论如何都没有内存。在后一种情况下,该地址范围内有内存,但您不拥有它。
如果您要访问一个随机地址,那么您获得的地址取决于操作系统当时如何设置您的进程。
如果你访问一个内存之类的*((int*)0)=1
,你会得到SEGV_MAPERR
。
如果你用 保护记忆mprotect(2)
,例如,mprotect(buffer, pagesize, PROT_READ)
然后你修改记忆*(buffer)=1
,你会得到SEGV_ACCERR
。
请man mprotect
详细了解。