gpt4 book ai didi

c++ - 为什么在 32 位 ARM 平台上 SIGSEGV 的故障地址是 0x00000006?

转载 作者:太空宇宙 更新时间:2023-11-04 05:41:11 25 4
gpt4 key购买 nike

我在我的程序中遇到了 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 理解为故障地址。堆栈是否被非法修改?但是在错误的代码附近,没有找到返回语句,也没有找到跳转工具。

还有其他可能的原因吗?非常感谢!

最佳答案

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

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

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

您自己提到“无效/野函数指针”是一个可能的原因。但是,为什么您对控制权转移到地址 6 感到惊讶呢?无效指针可以获得任意值,不一定在 4 字节或 8 字节边界上对齐。

关于c++ - 为什么在 32 位 ARM 平台上 SIGSEGV 的故障地址是 0x00000006?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18928699/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com