为什么SIGSEGV崩溃的故障地址保持不变?

问题描述

我有一个多线程 CPP 程序(一个监听线程,一个数据处理器线程)在 arm64-v8a Android 平台上移动。

最近由于相同的原因,它继续崩溃:

E CRASH   : signal 11 (SIGSEGV),code 1 (SEGV_MAPERR),fault addr fffffffffffffffc

据我所知,由于 fault addr 保持不变,因此不可能出现“访问数组越界”或“取消引用 NULL/未初始化指针”之类的情况,所以我能想到的唯一原因是“堆栈溢出”,我说得对吗?

那么我的程序到底发生了什么,更重要的是我该怎么做才能找到真正的原因和解决方案?

提前致谢。

解决方法

故障地址保持不变并不意味着您可以排除您提到的问题。事实上,在我看来,正在执行具有 NULL 值的指针算术(例如数组索引),导致 -4 被用作地址。

你可以在调试器下运行你的程序,或者至少用一个来分析核心转储。此外,请使用 {Memory,Address,Thread}Sanitizers 或类似的检测工具。