我有一组本机代码崩溃,但很少发生,但一直在发生SEGV_MAPERR或SEGV_ACCERR。这些崩溃几乎总是由Crashlytics报告,RAM非常低(通常为1-5%)。 '正常'崩溃(即我调试过的)在RAM中没有模式。内存不足会导致本地代码中出现seg错误?
是否有可能这些崩溃是由低内存条件造成的?这将是什么机制?有什么办法可以判断这些内存是否与低内存相关的崩溃或编程错误(错误地使用指针等)?在很多情况下,崩溃发生在我无法调试的库中,我无法在设备上复制崩溃。
这里的一些崩溃从开发者控制台拉,因为它提供了比Crashlytics更详细一点,在这种情况下跟踪:
********** Crash dump: **********
Build fingerprint: 'htc/a32eul_metropcs_us/htc_a32eul:5.1/LMY47O/637541.3:user/release-keys'
pid: 10902, tid: 10989, name: .xxx.xxxx >>> com.xxx.xxxxx <<<
signal 11 (SIGSEGV), code 2 (SEGV_ACCERR), fault addr 0x97f78000
Stack frame #00 pc 0004cd80 /data/app/xxx.xxx.xxxxx-1/lib/arm/libxxx.so: Routine xxxxxMixerInterleavedFloatOutput at libgcc2.c:?
********** Crash dump: **********
Build fingerprint: 'Xiaomi/land/land:6.0.1/MMB29M/V8.1.1.0.MALMIDI:user/release-keys'
pid: 2661, tid: 2746, name: .xxx.xxxx >>> com.xxx.xxxx <<<
signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x0
Stack frame #00 pc 00016954 /system/lib/libc.so (__memcpy_base+36)
Stack frame #01 pc 0000b14c /data/app/com.xxx.xxxx-2/lib/arm/libswresample-2.so: Routine ??
??:0
'SEG_MAPERR'通常是由一个错误的指针操作导致的(使用一个悬挂指针,从数组尾部脱落,取消引用NULL)。 'SEG_ACCERR'往往与尝试访问未经授权的内存相关联(例如写入只读页面)。虽然内存不足可能会增加发生这种事情的几率,但根本原因将是代码中的指针操作不正确。 – Peter