android - 内存不足会导致 native 代码出现段错误吗?

标签 android c++ android-ndk segmentation-fault crashlytics-android

我在 native 代码中遇到了一组崩溃,这些崩溃很少见,但在涉及 SEGV_MAPERR 或 SEGV_ACCERR 时经常发生。这些崩溃几乎总是由 Crashlytics 报告,且可用 RAM 非常低(通常为 1-5%)。 “正常”崩溃(即我调试过的崩溃)在 RAM free 中没有模式。

这些崩溃是否可能是由内存不足引起的?这将是什么机制?有什么方法可以判断这些是与低内存相关的崩溃还是编程错误(错误使用指针等)?在许多情况下,崩溃发生在我无法调试的库中,我无法在我的设备上复制崩溃。

以下是从 Developer Console 中提取的一些崩溃,因为在这些情况下,它提供了比 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

最佳答案

一般有两种可能性:

  1. 低内存条件本身不会以某种方式在正在运行的应用程序中触发段错误。可能发生的情况是,当应用程序要求为其分配额外的内存时,内存分配请求失败。这是一个明确定义的内存条件。据记载,相关系统调用在分配内存时可能会失败。但经常发生的情况是应用程序没有正确编码以检查失败的内存分配请求,因此它们崩溃了。在那种情况下,低内存条件不会导致应用程序段错误,这是一个应用程序错误。

  2. Linux 内核 overcommits the available memory .因此,当所有可用 RAM 都已耗尽时,内核可能别无选择,只能选择要终止的进程。

但是,在 OOM killer 启动的情况下,选定的受害者将以 SIGKILL 终止。 SEGFAULT 表示应用程序错误。

关于android - 内存不足会导致 native 代码出现段错误吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41325736/

相关文章:

android - 我怎样才能沿着道路推断得更远?

c++ - 预处理器、汇编器和链接器是编译器的一部分吗?

android - NDK 解析结果 : Project settings: Gradle model version=5. 4.1,NDK 版本未知错误

android - 如何授予android shell 用户android.permission.RECORD_AUDIO 权限?

Android Ndk Basic 关于 native 字符串

在 Jenkins : unable to resolve target 中使用 ant 构建 Android

android - 由于: '' pm install-create -r -t -S 465463 6' returns error ' UNSUPPORTED'',安装失败

android - 更改 ffmpeg 输出中的分辨率以在 Android 中显示视频流

c++ - 总是返回成员变量 getter 的引用是个好主意吗?

C++ const void* 转换