0

我在我的程序中遇到了 SEGV_MAPERR 崩溃。

pid: 934, tid: 934, name: Binder_1  >>> system_server <<<
signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 00000006
backtrace:
    #00  pc 00000006  <unknown>
    #01  pc 00006925  /system/lib/libcutils.so (set_sched_policy+136)
    #02  pc ffffffff  <unknown>

我可以理解故障地址是 0x00000000 或 0x00000004 或其他。例如,无效的类虚拟基指针,或无效/野函数指针。

但我无法将 0x00000006 理解为故障地址。堆栈是否被非法修改?但是在错误代码附近,没有找到return语句,也没有找到跳转工具。

还有其他潜在的原因吗?非常感谢!

4

1 回答 1

6

我不明白你为什么觉得奇怪。这将是尝试6通过空指针访问偏移处的内存位置的典型结果。例如,如果你有char *string并且访问string[6]whenstring恰好是一个空指针,你通常会在 address 处得到段错误6。访问string[7]并在地址处获取段错误7(哇!这个甚至不是!!!)这样您就可以访问绝对任意的地址并获得段错误。

(迂腐的东西:......假设空指针由零地址表示并且char与机器字节匹配)

如果段错误是由控制转移到地址引起的6,那么可能有很多不同的原因。例如,通过以某种方式获取值的无效函数指针6(未初始化的指针,被附近的缓冲区溢出损坏的指针)执行调用。或者,存储函数返回地址的堆栈位置可能已被缓冲区溢出和获取的 value 损坏6,这导致在函数返回时将控制转移到地址 6。等等等等。

您自己提到“无效/野生函数指针”作为可能的原因。但是为什么你会惊讶于控制权被转移到 address6呢?无效指针可以获取任意值,不一定在 4 字节或 8 字节边界上对齐。

于 2013-09-21T05:29:15.063 回答