【问题标题】:What is the meaning of 'code' in Segmentation Fault分段错误中的“代码”是什么意思
【发布时间】:2013-10-01 20:05:57
【问题描述】:

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

谢谢。

【问题讨论】:

  • SEGV_MAPERR 是内存分配错误(悬空指针、内存溢出等),SEGV_ACCERR 是内存访问错误,通常是权限。还是您在寻找更多?
  • 说 SEGV_ACCERR 是由堆栈损坏引起的公平吗?
  • 好吧,我想可能是您使用堆栈指针来访问您无权访问的内存,但这似乎不太可能。你在做什么?

标签: android linux


【解决方案1】:

siginfo.h:

SEGV_MAPERR 表示您尝试访问的地址没有映射到任何东西。

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

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

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

【讨论】:

    【解决方案2】:

    如果你访问像*((int*)0)=1 这样的内存,你会得到SEGV_MAPERR

    如果你用mprotect(2)保护了一个内存,例如mprotect(buffer, pagesize, PROT_READ),那么你修改了*(buffer)=1这样的内存,你会得到SEGV_ACCERR

    详情请man mprotect

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-05-18
      • 1970-01-01
      • 2016-03-28
      • 1970-01-01
      相关资源
      最近更新 更多