Fatal signal 11 (SIGSEGV) at 0x00000008 (code=1)应用闪退

接手的安卓项目偶尔出现闪退,多在输入字符时发生且位置不定。经谷歌查找资料,发现可能是资源被提前释放(如 bitmap 被回收但仍被引用),也可能是硬件加速导致复杂自定义渲染出错。通过禁止硬件加速、在指定 View 上关闭硬件加速,项目暂时未再闪退。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

由于是接收别人做的项目,而这个闪退现象也只是偶尔出现,但是一般是出现在输入字符的情况比较多,出现的位置还不确定,查了很久,查的想死。

百度完全不行,只好谷歌翻墙了。



谷歌了很久,今天看到了这个帖子,感觉跟我的问题很像,就试了下,把硬件加速给禁止了,现在还在测试中,先记录下。

https://forums.adobe.com/message/6243025


==============================================================================================

又经过一段时间的查找资料,发现,可能的情况有:

1.有资源被引用了,但是在未知的情况下被释放了,但是该引用报错。

很大原因是因为bitmap被回收了,但是还有地方有引用这个图片 https://code.google.com/p/android/issues/detail?id=14498


2.怀疑是硬件加速导致的问题。 经过分析发现使用了比较复杂的自定义View,可能会导致硬件加速渲染出错。

所以,可以在指定的View上关闭硬件加速:

myView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
或者使用android:layerType="software"来关闭硬件加速:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical"
    android:paddingLeft="2dp"
    android:layerType="software"
    android:paddingRight="2dp" >

还有就是经常报这个错误:GL error from OpenGLRenderer: 0x502,OpenGLRenderer  GL_INVALID_OPERATION。看着真是着急。也是跟硬件加速有关的。


就可以解决问题了。至少我的项目中修改后,暂时还没有出现闪退现象了。


贴下错误日志:


还有这种情况,也是类似的:



<think>好的,用户遇到了Unity游戏在模拟器中出现的致命信号11SIGSEGV)错误,具体是SEGV_MAPERR类型。这个问题通常与内存访问错误有关,比如访问了未初始化或已释放的内存区域,或者空指针解引用。根据用户提供的引用内容,特别是引用[1]提到的Application.quit()导致的问题,以及引用[2]中的空指针错误,我需要综合这些信息来提出解决方案。 首先,用户的问题是在模拟器中出现的,可能涉及到代码中的退出逻辑或者资源释放的问题。引用[1]指出,使用Application.quit()在某些安卓设备上会导致crash,可能涉及到Unity与安卓平台的交互问题。引用[2]中的空指针错误提示可能是由于模型推理时的指针问题,但这里用户的问题可能更偏向于Unity本身的代码或模拟器设置。 接下来,我需要考虑常见的解决方案。根据引用[3],用户通过调整SDK和NDK路径解决了问题,这可能涉及到开发环境的配置。因此,检查NDK版本和路径是否正确是必要的。同时,模拟器的设置,如使用x86架构可能导致兼容性问题,建议使用ARM64镜像。 此外,内存泄漏或资源未正确释放也可能导致SIGSEGV错误。用户需要检查代码中是否有在退出时未正确销毁的对象,或者协程未正确停止的情况。开启Unity的深层次内存检测工具,如Memory Profiler,可以帮助定位问题。 最后,如果问题依旧存在,建议用户尝试更新Unity版本或模拟器,以及查看官方文档和社区是否有类似问题的解决方案。需要综合环境配置、代码审查和工具检测来全面解决这个问题。</think>### 逐步解决方案:Unity模拟器中SIGSEGV (SEGV_MAPERR) 错误排查 1. **检查代码中的退出逻辑** - 避免直接使用 `Application.Quit()` 退出,尤其是在安卓平台上。可以尝试通过调用 `System.Diagnostics.Process.GetCurrentProcess().Kill()` 或 **延迟退出** 的方式避免资源冲突[^1]。 - 示例代码: ```csharp IEnumerator SafeExit() { yield return new WaitForSeconds(0.5f); // 延迟释放资源 Application.Quit(); } ``` 2. **验证内存访问安全性** - 检查所有 **指针操作、数组越界、空引用** 的代码段。例如引用[2]中提到的空指针解引用问题(`output_tensor_array[col + 1024 * row] == 2`),需确保指针已正确初始化且内存已分配。 - 使用 `Debug.Log` 或断点验证关键变量的有效性。 3. **更新NDK/SDK版本与环境配置** - 确保NDK版本与Unity兼容,避免使用过时的NDK(如r14b)。建议升级至 **NDK r21+**,并在Unity Editor的 `Build Settings > Android > NDK` 中指定路径[^3]。 - 检查 `local.properties` 文件中的路径是否包含特殊字符或空格,建议使用纯英文路径。 4. **调整模拟器配置** - 使用 **ARM64系统镜像** 替代x86镜像(某些Unity功能在x86模拟器中存在兼容性问题)。 - 在Android Studio的AVD Manager中,为模拟器分配更多内存(建议4GB以上)。 5. **启用Unity深层次调试工具** - 在 `Edit > Project Settings > Player > Other Settings` 中开启: - **Script Debugging** 和 **Wait For Managed Debugger**(捕获C#层错误) - **Deep Profiling Support**(检测内存泄漏) 6. **检查第三方插件与资源释放** - 若使用了 **原生插件(如MNN、OpenCV)**,确保其与模拟器架构(ARM/x86)匹配。 - 在 `OnDestroy()` 或 `OnApplicationQuit()` 中手动释放非托管资源(如文件句柄、网络连接)。 --- ### 相关问题 1. 如何检测Unity中的内存泄漏? 2. 安卓模拟器运行Unity游戏时出现黑屏如何解决? 3. 为什么Unity的协程(Coroutine)可能导致崩溃? : 引用[1]: Unity Android平台Application.quit()引起的signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr ... [^2]: 引用[2]: signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x0(Cause: null pointer dereference) : 引用[3]: signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x8。我的解决办法: 把local.propertiers文件改成: sdk.dir=D:\Downloads\AS\sdk1\sdk1 ndk.dir=D:\Downloads\AS\sdk1\sdk1\ndk\android-ndk-r14b
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

文韬_武略

你的鼓励是我创作最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值