Android 什么是';代码';分段故障

Android 什么是';代码';分段故障,android,linux,Android,Linux,我在android中看到了这两个分段错误。 一个说塞格沃·马佩尔,另一个说塞格沃·阿克尔 你能告诉我这两个有什么不同吗 signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 41963214 signal 11 (SIGSEGV), code 2 (SEGV_ACCERR), fault addr 4006e000 谢谢。每: SEGV_MAPERR表示您试图访问一个没有映射到任何内容的地址 SEGV_ACCERR表示您试图访问一个您无权

我在android中看到了这两个分段错误。 一个说塞格沃·马佩尔,另一个说塞格沃·阿克尔

你能告诉我这两个有什么不同吗

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(缓冲区、页面大小、保护读取)
,则修改内存,如
*(缓冲区)=1
,您将得到
SEGV\u ACCERR


有关详细信息,请参见
man mprotect

SEGV\u MAPERR
是内存分配错误(指针悬空、内存溢出等),
SEGV\u ACCERR
是内存访问错误,通常是权限错误。或者你在寻找更多的东西吗?公平地说SEGV_ACCERR是由堆栈损坏引起的吗?嗯,我想可能是因为你使用了堆栈指针来访问你没有权限访问的内存,但这似乎不太可能。你在做什么?