9

我在 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

谢谢。

4

2 回答 2

15

siginfo.h

SEGV_MAPERR 表示您试图访问一个不映射到任何东西的地址。

SEGV_ACCERR 表示您试图访问您无权访问的地址。

因此,在这两种情况下,您都访问了您不应该拥有的地址,这可能是您的实际代码唯一有罪的地方。在前一种情况下,该地址范围内无论如何都没有内存。在后一种情况下,该地址范围内有内存,但您不拥有它。

如果您要访问一个随机地址,那么您获得的地址取决于操作系统当时如何设置您的进程。

于 2013-10-01T20:13:10.633 回答
1

如果你访问一个内存之类的*((int*)0)=1,你会得到SEGV_MAPERR

如果你用 保护记忆mprotect(2),例如,mprotect(buffer, pagesize, PROT_READ)然后你修改记忆*(buffer)=1,你会得到SEGV_ACCERR

man mprotect详细了解。

于 2015-10-27T06:46:32.983 回答