我在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
感谢。
答案 0 :(得分:12)
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
了解详情。