#83948 SIGSEGV(SEGV_MAPERR) #01 pc 0075de71 /vendor/lib/libllvm-glnext.so [armeabi-v8]

本文记录了一个新项目的开发过程中遇到的SIGSEGV(SEGV_MAPERR)错误,该错误主要出现在Android 8.1.0系统的手机上。通过调整Gradle配置和集成百度地图jar包,部分机型问题得到解决,但仍有特定型号手机报错。最终发现,降低编译版本至26可以避免此问题。

#83948 SIGSEGV(SEGV_MAPERR)
#01 pc 0075de71 /vendor/lib/libllvm-glnext.so [armeabi-v8]

最近新上项目,有的机型会报这个错误。

在这里插入图片描述
主要集中在8.1.0系统的手机上。
问题待解决,先记录

第二天更新:
重新集成了百度地图jar包,只留了一套so包

在这里插入图片描述
bugly中,VIVO-1809A(VIVOX23)和荣耀-APEAL00(8Xmax)不在报错了。。
但是OPPO-PBBM30和小米3油报错了。这几款手机都是8.1.0的系统。

在这里插入图片描述
现在怀疑gradle配置的问题,之前编译是26,现在改为28 了。之前8.1.0不报错,6.0报错,
现在用户手机以9.0和8.0为主,看来这编译不是越新越好。

退回26就可以了。

当程序遇到 `SIGSEGV` 错误时,通常意味着访问了未分配给该进程的内存区域,或尝试以不正确的方式访问内存(如只读内存的写入操作)。具体到 `libdispatch.dylib` 中的 `_dispatch_source_set_timer` 函数,该函数属于 GCD(Grand Central Dispatch)框架,用于设置定时器源,以便在特定时间触发任务。如果在此过程中发生 `SIGSEGV` 错误,并且错误代码为 `SEGV_ACCERR`,则表明访问权限冲突,即尝试访问的内存区域存在权限限制[^1]。 ### 可能的原因 1. **无效的调度源(dispatch source)** 如果传递给 `_dispatch_source_set_timer` 的调度源无效或已被释放,可能导致访问非法内存地址。GCD 要求调度源在使用期间保持有效状态,若在释放后继续使用,可能会引发段错误。 2. **多线程竞争条件** 在多线程环境中,若多个线程同时操作同一个调度源而未进行同步,可能导致调度源内部状态损坏,从而引发内存访问异常。 3. **内存损坏(Memory Corruption)** 如果程序中存在内存越界写入、悬空指针使用等问题,可能导致 GCD 内部结构损坏,从而在调用 `_dispatch_source_set_timer` 时触发段错误。 4. **系统版本或库文件异常** 在极少数情况下,macOS 系统本身的 `libdispatch.dylib` 文件可能损坏,或当前系统版本存在 GCD 实现的 bug,也可能导致此类问题。 --- ### 解决方案与排查建议 1. **启用核心转储(Core Dump)并分析堆栈信息** 如引用中所述,确保 `kern.coredump` 和 `ulimit` 设置正确,以便在发生崩溃时生成核心转储文件。使用 `lldb` 或 `gdb` 工具加载核心转储文件,查看详细的崩溃堆栈信息,定位具体出错的代码位置。 ```bash lldb /path/to/executable -c /path/to/corefile ``` 2. **检查调度源生命周期管理** 确保在调用 `_dispatch_source_set_timer` 前,调度源对象未被释放。使用 `dispatch_retain` 和 `dispatch_release` 正确管理对象生命周期,或在使用 ARC(自动引用计数)环境下确保调度源被强引用持有。 3. **排查多线程同步问题** 使用线程检查工具(如 AddressSanitizer、ThreadSanitizer)检测是否存在线程竞争条件。确保对调度源的修改操作在串行队列中执行,或通过锁机制保护共享资源。 4. **使用内存调试工具排查内存问题** 启用 AddressSanitizer 或 Guard Malloc 检查内存越界访问、使用已释放内存等问题。这些工具可以帮助识别潜在的内存破坏行为。 5. **更新系统与依赖库** 确保 macOS 系统及所有依赖库均为最新版本,以避免已知的兼容性或稳定性问题。 --- ### 示例:使用 AddressSanitizer 检查内存问题 ```bash # 编译时启用 AddressSanitizer clang -fsanitize=address -g your_program.c -o your_program # 运行程序 ./your_program ``` ---
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值