Segmentation Fault中'code'的含义是什么?

时间:2013-10-01 20:05:58

标签: android linux

我在android中看到了这2个分段错误。 一个说SEGV_MAPERR,另一个说SEGV_ACCERR。

请告诉我这两个之间的区别是什么?

signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 41963214

signal 11 (SIGSEGV), code 2 (SEGV_ACCERR), fault addr 4006e000

感谢。

2 个答案:

答案 0 :(得分:12)

siginfo.h

SEGV_MAPERR表示您尝试访问的地址未映射到任何内容。

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

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

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

答案 1 :(得分:0)

如果您访问UILabel *myLabel = [[UILabel alloc] initWithFrame:CGRectMake(20, 100, 15, 15)]; myLabel.backgroundColor = [UIColor darkGrayColor]; [self.view addSubview:myLabel]; 之类的内存,则会获得*((int*)0)=1

如果您使用SEGV_MAPERR保护了内存,例如mprotect(2),那么您修改了mprotect(buffer, pagesize, PROT_READ)之类的内存,您将获得*(buffer)=1

SEGV_ACCERR了解详情。