首页 > 解决方案 > 为什么SIGSEGV crash的故障地址还是一样?

问题描述

我有一个在 arm64-v8a Android 平台上转移的多线程 CPP 程序(一个侦听器线程、一个数据处理器线程)。

最近它继续崩溃,原因如下所示:

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

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

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

提前致谢。

标签: androidc++segmentation-faultstack-overflowarm64

解决方案


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

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


推荐阅读