Fatal signal 11 (SIGSEGV), code 1, fault addr 0x8 in tid 4101 (Thread-28)

老项目偶现闪退问题及解决方案

老项目偶尔会闪退,找日志又找不到原因,最终发现了报错的日志

2023-06-15 10:23:07.050 2687-2687/? A/libc: Fatal signal 11 (SIGSEGV), code 1, fault addr 0x4 in tid 2687 (om.iterminal.test)
2023-06-15 10:23:07.050 212-212/? W/: debuggerd: handling request: pid=2687 uid=10126 gid=10126 tid=2687
2023-06-15 10:23:07.130 3160-3160/? A/DEBUG: *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
2023-06-15 10:23:07.130 3160-3160/? A/DEBUG: Build fingerprint: 'Android/rk3399_all/rk3399_all:7.1.2/NHG47K/ys-an707071051:userdebug/test-keys'
2023-06-15 10:23:07.130 3160-3160/? A/DEBUG: Revision: '0'
2023-06-15 10:23:07.130 3160-3160/? A/DEBUG: ABI: 'arm'
2023-06-15 10:23:07.131 3160-3160/? A/DEBUG: pid: 2687, tid: 2687, name: om.iterminal.test  >>> com.iterminal.test <<<
2023-06-15 10:23:07.131 3160-3160/? A/DEBUG: signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x4
2023-06-15 10:23:07.131 3160-3160/? A/DEBUG:     r0 00000000  r1 00000004  r2 ffa2ba10  r3 ee6ec008
2023-06-15 10:23:07.131 3160-3160/? A/DEBUG:     r4 ee6ec008  r5 ee6ec008  r6 12c03be0  r7 ffffffff
2023-06-15 10:23:07.131 3160-3160/? A/DEBUG:     r8 6fb5e2c4  r9 ee105400  sl c78b2000  fp ffffffff
2023-06-15 10:23:07.131 3160-3160/? A/DEBUG:     ip efdd1064  sp ffa2ba08  lr efdb6997  pc f07bdd3e  cpsr 000f0030
2023-06-15 10:23:07.389 439-606/system_process I/InputDispatcher: Dropping event because there is no touchable window at (889, 867).
2023-06-15 10:23:07.707 3160-3160/? A/DEBUG: backtrace:
2023-06-15 10:23:07.707 3160-3160/? A/DEBUG:     #00 pc 0000bd3e  /system/lib/libutils.so (_ZNK7android7RefBase9incStrongEPKv+3)
2023-06-15 10:23:07.708 3160-3160/? A/DEBUG:     #01 pc 00051993  /system/lib/libgui.so (_ZNK7android7Surface25getIGraphicBufferProducerEv+20)
2023-06-15 10:23:07.708 3160-3160/? A/DEBUG:     #02 pc 0008ac35  /system/lib/libandroid_runtime.so
2023-06-15 10:23:07.708 3160-3160/? A/DEBUG:     #03 pc 0008afef  /system/lib/libandroid_runtime.so
2023-06-15 10:23:07.708 3160-3160/? A/DEBUG:     #04 pc 01eaa3e5  /system/framework/arm/boot-framework.oat (offset 0x15d8000) (android.view.Surface.nativeIsValid+88)
2023-06-15 10:23:07.708 3160-3160/? A/DEBUG:     #05 pc 01eab437  /system/framework/arm/boot-framework.oat (offset 0x15d8000) (android.view.Surface.isValid+114)
2023-06-15 10:23:07.708 3160-3160/? A/DEBUG:     #06 pc 01eb35eb  /system/framework/arm/boot-framework.oat (offset 0x15d8000) (android.view.SurfaceView.updateWindow+2614)
2023-06-15 10:23:07.708 3160-3160/? A/DEBUG:     #07 pc 01eb29e5  /system/framework/arm/boot-framework.oat (offset 0x15d8000) (android.view.SurfaceView.setVisibility+120)
2023-06-15 10:23:07.708 3160-3160/? A/DEBUG:     #08 pc 000a99c1  /system/lib/libart.so (art_quick_invoke_stub_internal+64)
2023-06-15 10:23:07.708 3160-3160/? A/DEBUG:     #09 pc 00405281  /system/lib/libart.so (art_quick_invoke_stub+232)
2023-06-15 10:23:07.708 3160-3160/? A/DEBUG:     #10 pc 000b0c55  /system/lib/libart.so (_ZN3art9ArtMethod6InvokeEPNS_6ThreadEPjjPNS_6JValueEPKc+136)
2023-06-15 10:23:07.708 3160-3160/? A/DEBUG:     #11 pc 001ed0d5  /system/lib/libart.so (_ZN3art11interpreter34ArtInterpreterToCompiledCodeBridgeEPNS_6ThreadEPNS_9ArtMethodEPKNS_7DexFile8CodeItemEPNS_11ShadowFrameEPNS_6JValueE+200)
2023-06-15 10:23:07.708 3160-3160/? A/DEBUG:     #12 pc 001e7685  /system/lib/libart.so (_ZN3art11interpreter6DoCallILb0ELb0EEEbPNS_9ArtMethodEPNS_6ThreadERNS_11ShadowFrameEPKNS_11InstructionEtPNS_6JValueE+492)
2023-06-15 10:23:07.708 3160-3160/? A/DEBUG:     #13 pc 003ff6fb  /system/lib/libart.so (MterpInvokeVirtualQuick+322)
2023-06-15 10:23:07.708 3160-3160/? A/DEBUG:     #14 pc 000a0594  /system/lib/libart.so (ExecuteMterpImpl+29972)
2023-06-15 10:23:07.708 3160-3160/? A/DEBUG:     #15 pc 001ca9af  /system/lib/libart.so (_ZN3art11interpreterL7ExecuteEPNS_6ThreadEPKNS_7DexFile8CodeItemERNS_11ShadowFrameENS_6JValueEb+290)
2023-06-15 10:23:07.708 3160-3160/? A/DEBUG:     #16 pc 001cf481  /system/lib/libart.so (_ZN3art11interpreter30EnterInterpreterFromEntryPointEPNS_6ThreadEPKNS_7DexFile8CodeItemEPNS_11ShadowFrameE+92)
2023-06-15 10:23:07.708 3160-3160/? A/DEBUG:     #17 pc 003f4787  /system/lib/libart.so (artQuickToInterpreterBridge+706)
2023-06-15 10:23:07.708 3160-3160/? A/DEBUG:     #18 pc 000ae413  /system/lib/libart.so (art_quick_to_interpreter_bridge+34)
2023-06-15 10:23:07.709 3160-3160/? A/DEBUG:     #19 pc 0164d39d  /system/framework/arm/boot-framework.oat (offset 0x15d8000) (android.os.Handler.dispatchMessage+112)
2023-06-15 10:23:07.709 3160-3160/? A/DEBUG:     #20 pc 01c04baf  /system/framework/arm/boot-framework.oat (offset 0x15d8000) (android.os.Looper.loop+714)
2023-06-15 10:23:07.709 3160-3160/? A/DEBUG:     #21 pc 0165e737  /system/framework/arm/boot-framework.oat (offset 0x15d8000) (android.app.ActivityThread.main+426)
2023-06-15 10:23:07.709 3160-3160/? A/DEBUG:     #22 pc 000a99c1  /system/lib/libart.so (art_quick_invoke_stub_internal+64)
2023-06-15 10:23:07.709 3160-3160/? A/DEBUG:     #23 pc 00405389  /system/lib/libart.so (art_quick_invoke_static_stub+228)
2023-06-15 10:23:07.709 3160-3160/? A/DEBUG:     #24 pc 000b0c7f  /system/lib/libart.so (_ZN3art9ArtMethod6InvokeEPNS_6ThreadEPjjPNS_6JValueEPKc+178)
2023-06-15 10:23:07.709 3160-3160/? A/DEBUG:     #25 pc 00315e81  /system/lib/libart.so (_ZN3artL18InvokeWithArgArrayERKNS_33ScopedObjectAccessAlreadyRunnableEPNS_9ArtMethodEPNS_8ArgArrayEPNS_6JValueEPKc+56)
2023-06-15 10:23:07.709 3160-3160/? A/DEBUG:     #26 pc 00317213  /system/lib/libart.so (_ZN3art12InvokeMethodERKNS_33ScopedObjectAccessAlreadyRunnableEP8_jobjectS4_S4_j+766)
2023-06-15 10:23:07.709 3160-3160/? A/DEBUG:     #27 pc 002bd4ed  /system/lib/libart.so (_ZN3artL13Method_invokeEP7_JNIEnvP8_jobjectS3_S3_+40)
2023-06-15 10:23:07.709 3160-3160/? A/DEBUG:     #28 pc 005aed49  /system/framework/arm/boot.oat (offset 0x51b000) (java.lang.reflect.Method.invoke+116)
2023-06-15 10:23:07.709 3160-3160/? A/DEBUG:     #29 pc 020fcbf9  /system/framework/arm/boot-framework.oat (offset 0x15d8000) (com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run+100)
2023-06-15 10:23:07.709 3160-3160/? A/DEBUG:     #30 pc 020fdbd5  /system/framework/arm/boot-framework.oat (offset 0x15d8000) (com.android.internal.os.ZygoteInit.main+1536)
2023-06-15 10:23:07.709 3160-3160/? A/DEBUG:     #31 pc 000a99c1  /system/lib/libart.so (art_quick_invoke_stub_internal+64)
2023-06-15 10:23:07.709 3160-3160/? A/DEBUG:     #32 pc 00405389  /system/lib/libart.so (art_quick_invoke_static_stub+228)
2023-06-15 10:23:07.709 3160-3160/? A/DEBUG:     #33 pc 000b0c7f  /system/lib/libart.so (_ZN3art9ArtMethod6InvokeEPNS_6ThreadEPjjPNS_6JValueEPKc+178)
2023-06-15 10:23:07.709 3160-3160/? A/DEBUG:     #34 pc 00315e81  /system/lib/libart.so (_ZN3artL18InvokeWithArgArrayERKNS_33ScopedObjectAccessAlreadyRunnableEPNS_9ArtMethodEPNS_8ArgArrayEPNS_6JValueEPKc+56)
2023-06-15 10:23:07.709 3160-3160/? A/DEBUG:     #35 pc 00315c93  /system/lib/libart.so (_ZN3art17InvokeWithVarArgsERKNS_33ScopedObjectAccessAlreadyRunnableEP8_jobjectP10_jmethodIDSt9__va_list+266)
2023-06-15 10:23:07.709 3160-3160/? A/DEBUG:     #36 pc 00277b97  /system/lib/libart.so (_ZN3art3JNI21CallStaticVoidMethodVEP7_JNIEnvP7_jclassP10_jmethodIDSt9__va_list+426)
2023-06-15 10:23:07.709 3160-3160/? A/DEBUG:     #37 pc 000666ad  /system/lib/libandroid_runtime.so
2023-06-15 10:23:07.709 3160-3160/? A/DEBUG:     #38 pc 00067f7f  /system/lib/libandroid_runtime.so (_ZN7android14AndroidRuntime5startEPKcRKNS_6VectorINS_7String8EEEb+498)
2023-06-15 10:23:07.710 3160-3160/? A/DEBUG:     #39 pc 00001947  /system/bin/app_process32
2023-06-15 10:23:07.710 3160-3160/? A/DEBUG:     #40 pc 00016c4d  /system/lib/libc.so (__libc_init+48)
2023-06-15 10:23:07.710 3160-3160/? A/DEBUG:     #41 pc 00001564  /system/bin/app_process32

各种百度,各种方式也都尝试了,把代码一点一点的排查,都解决不掉,根据报错的日志信息,一点一点扣,因为我们的是在点击按钮切换页面,然后再返回,重复循环操作,快速进页面关页面,然后就会闪退也不是每次都会闪退,但是闪退的还挺频繁的,突发奇想

观察一下activity的生命周期,发现oncreate(),onstop().ondestroy()不是成对出现的,一旦闪退的时候就是乱七八糟的,所以我给进页面的onclick()方法加了防双击判断,然后就没再测出来闪退,不知道是否彻底解决了,先记录一下

欢迎指正

<think>我们已经收集了关于Fatal signal 11 (SIGSEGV)错误的信息,特别是当fault addr0x0时,这通常表示程序试图访问一个空指针(NULL pointer dereference)。在Android开发中,这种错误通常发生在本地代码(如JNI)中。根据引用[1]和[2]提供的线索,我们可以总结出以下几种可能的原因和解决方案: 1. **空指针解引用**:程序试图访问一个空指针(即地址0x0)指向的内存。这通常是由于编程错误导致的,比如在C/C++代码中没有检查指针是否为空就使用它。 2. **硬件加速问题**:在引用[2]中提到,React Native应用中的WebView组件在安卓12上可能会导致此问题。解决方案包括: - 设置WebView的`renderToHardwareTextureAndroid={true}`,但要注意这可能会在部分不支持硬件加速的设备上引发闪退。 - 在WebView的style中增加属性`overflow: 'hidden'`和`opacity: 0.99`,并在其上层View中设置`overflow: 'hidden'`。 - 此外,安卓12上新的滑动效果(overscroll)也可能导致此问题。如果WebView嵌套在ScrollView中,可以设置`overScrollMode="never"`。 3. **其他可能的原因**:内存损坏、堆栈溢出、使用已释放的内存等。 针对用户的具体错误信息:“tid 31554 (ImageReader-640)”,这提示错误发生在与图像读取相关的线程中。因此,我们需要关注与图像处理相关的代码。 **解决步骤:** 1. **检查本地代码(如果有)**:如果应用使用了JNI,那么需要检查与ImageReader相关的本地代码。特别注意: - 指针在使用前是否进行了空值检查。 - 内存管理是否正确(如避免野指针、重复释放等)。 2. **检查第三方库**:如果使用了第三方图像处理库,确保它们与当前Android版本(特别是安卓12)兼容。有时库中的bug会导致此类错误。 3. **查看日志**:除了崩溃日志,还需要查看logcat中的详细日志,特别是崩溃发生前的日志,以获取更多线索。 4. **尝试复现**:尝试在特定环境下复现问题,例如在安卓12设备上执行特定的图像读取操作。 5. **更新依赖库**:确保所有依赖库(特别是与图像处理相关的库)都是最新版本,因为新版本可能已经修复了相关bug。 6. **使用工具诊断**: - 使用AddressSanitizer(ASan)来检测内存错误。 - 使用NDK中的`ndk-stack`工具来将崩溃日志中的地址转换为可读的代码行。 7. **检查权限**:确保应用具有所需的权限(例如读取外部存储的权限),特别是在安卓12上,权限管理更为严格。 由于用户提到错误发生在“ImageReader-640”线程中,我们可以推测问题可能与Android的ImageReader类有关。在Android中,ImageReader用于从相机或其他来源获取图像数据。常见的错误原因包括: - 在回调中访问了已经被释放或无效的Image对象。 - 多线程同步问题,比如在一个线程中关闭ImageReader,而另一个线程还在访问它的图像。 **建议的解决方案:** 1. **检查ImageReader的回调**:确保在`onImageAvailable`回调中,正确处理了Image对象,即在使用后及时调用`Image.close()`,但要注意不要在回调外部或另一个线程中访问已关闭的Image。 2. **检查Surface的释放**:如果ImageReader关联的Surface被提前释放,也可能导致问题。 3. **更新Android SDK和NDK**:确保使用最新版本的SDK和NDK,因为Google可能已经修复了相关的问题。 4. **在代码中添加防护**:在访问Image对象之前,检查它是否为null,并确保在访问后及时关闭。 示例代码: ```java try (Image image = imageReader.acquireLatestImage()) { if (image != null) { // 处理image } } catch (IllegalStateException e) { // 处理异常 } ``` 5. **查看官方文档和问题追踪**:检查Android官方问题追踪系统(issuetracker.google.com)中是否有类似问题的报告。 由于我们没有具体的代码,以上提供的是通用性的解决方案。如果上述方法不能解决问题,建议提供更详细的崩溃堆栈信息,以便进一步分析。 §§相关问题§§ 1. 如何诊断Android中的SIGSEGV错误? 2. 在Android开发中,如何避免空指针解引用? 3. ImageReader在Android中的正确使用方法有哪些? </think>### 解决 `A/libc: Fatal signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x0 in tid 31554 (ImageReader-640)` 错误的方法 此错误表示发生了**空指针解引用**(程序试图访问内存地址 `0x0`)。以下是针对 `ImageReader-640` 线程的解决方案: --- ### 核心解决方法 1. **检查图像处理代码的空指针** ```java // 示例:检查 acquireLatestImage() 返回值 Image image = imageReader.acquireLatestImage(); if (image == null) { // 必须检查空指针 Log.e(TAG, "Acquired image is null"); return; } try (Image.Plane[] planes = image.getPlanes()) { // 处理图像数据... } finally { image.close(); // 确保释放资源 } ``` 2. **修复 ImageReader 生命周期管理** - 确保 `ImageReader` 在 Activity/Fragment 的 `onPause()` 中关闭: ```java @Override protected void onPause() { if (imageReader != null) { imageReader.close(); imageReader = null; } super.onPause(); } ``` --- ### 针对性解决方案 根据错误线程名 `ImageReader-640`: 1. **检查 Camera2 API 调用链** - 验证 `ImageReader.newInstance()` 参数有效性(宽高/格式需设备支持) - 确保 `setOnImageAvailableListener()` 回调中及时处理图像: ```java imageReader.setOnImageAvailableListener(reader -> { Image image = null; try { image = reader.acquireLatestImage(); if (image == null) return; // 关键检查! // ...处理图像 } finally { if (image != null) image.close(); } }, backgroundHandler); // 确保 Handler 非空 ``` 2. **多线程同步问题** - 若使用多线程处理图像数据,添加同步锁: ```java private final Object imageLock = new Object(); public void processImage(Image image) { synchronized (imageLock) { // 处理图像... } } ``` --- ### 通用调试步骤 1. **获取完整 Native 堆栈** - 执行命令:`adb logcat -b crash > crash.log` - 使用 `ndk-stack` 定位 C/C++ 代码问题: ```bash ndk-stack -sym project/obj/local/armeabi-v7a -dump crash.log ``` 2. **启用 AddressSanitizer (ASan)** 在 `build.gradle` 中启用内存检测: ```gradle android { defaultConfig { externalNativeBuild { cmake { arguments "-DANDROID_ARM_MODE=arm", "-DANDROID_STL=c++_shared" cFlags "-fsanitize=address -fno-omit-frame-pointer" cppFlags "-fsanitize=address -fno-omit-frame-pointer" } } } } ``` 3. **检查 JNI 代码** 若涉及本地代码: - 使用 `env->ExceptionCheck()` 验证 JNI 调用 - 避免跨线程使用 `JNIEnv*` --- ### 预防措施 1. **升级依赖库** - 更新相机相关库(如 `androidx.camera:camera-core` 到最新版) 2. **添加全局异常捕获** ```java Thread.setDefaultUncaughtExceptionHandler((thread, ex) -> { if (ex.getMessage().contains("SIGSEGV") && thread.getName().equals("ImageReader-640")) { // 重启相机服务或上报错误 } }); ``` 该错误的根本原因是**无效内存访问**,主要发生在: - 未检查 `ImageReader.acquireLatestImage()` 返回的 `null` 值(相机未就绪时) - 已关闭的 `ImageReader` 仍被访问 - 跨线程操作未同步的图像数据[^1][^2]
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值