iOS14.5应用崩溃求助:gRPC相关EXC_BAD_ACCESS错误排查
iOS 14.5 下 gRPC 断言崩溃(activity_ != nullptr)解决思路
问题核心
应用在iOS 14.5系统中触发崩溃,iOS 15及以上版本可正常运行。错误日志显示gRPC Core内部断言失败:activity_ != nullptr,最终调用abort()导致崩溃,崩溃栈指向grpc_core::promise_detail::FreestandingActivity::Handle::DropActivity()。
错误日志
grpc_core::promise_detail::FreestandingActivity::Handle::DropActivity() (.cold.1): 0x109d9b367 <+0>: pushq %rbp 0x109d9b368 <+1>: movq %rsp, %rbp 0x109d9b36b <+4>: leaq 0xa15bd3(%rip), %rdi ; "/var/folders/hz/7v68p4h95sb2ypb614xp20jc00r7sc/T/ZipRelease/2023-04-27T16-15-03/project-ios/Pods/gRPC-Core/src/core/lib/promise/activity.cc" 0x109d9b372 <+11>: leaq 0xa1934d(%rip), %rcx ; "assertion failed: %s" 0x109d9b379 <+18>: leaq 0xa15c51(%rip), %r8 ; "activity_ != nullptr" 0x109d9b380 <+25>: pushq $0x2f 0x109d9b382 <+27>: popq %rsi 0x109d9b383 <+28>: pushq $0x2 0x109d9b385 <+30>: popq %rdx 0x109d9b386 <+31>: xorl %eax, %eax 0x109d9b388 <+33>: callq 0x109e94670 ; gpr_log 0x109d9b38d <+38>: callq 0x10a0b9a86 ; symbol stub for: abort 0x109d9b392 <+43>: pushq %rbp 0x109d9b393 <+44>: movq %rsp, %rbp 0x109d9b396 <+47>: movq 0xcc4413(%rip), %rax ; (void *)0x0000000006c88000 -> 0x109d9b39d <+54>: cmpb $0x0, (%rax) 0x109d9b3a0 <+57>: jne 0x109d9b3ba ; <+83> 0x109d9b3a2 <+59>: leaq 0xe27dc7(%rip), %rcx ; vtable for grpc_core::activity_detail::Unwakeable 0x109d9b3a9 <+66>: addq $0x10, %rcx 0x109d9b3ad <+70>: movq 0xcc449c(%rip), %rdx ; (void *)0x0000000006c88000 0x109d9b3b4 <+77>: movq %rcx, (%rdx) 0x109d9b3b7 <+80>: movb $0x1, (%rax) 0x109d9b3ba <+83>: popq %rbp 0x109d9b3bb <+84>: retq 0x109d9b3bc <+85>: addb %al, (%rax) 0x109d9b3be <+87>: addb %al, (%rax)
解决思路
升级gRPC版本
这是最直接的解决方案。该断言问题大概率是gRPC旧版本在iOS14.x系统下的兼容性bug,官方后续版本已修复。检查当前使用的gRPC版本,更新到最新稳定版(或明确修复该问题的版本)。如果用CocoaPods,修改Podfile中gRPC-Core的版本号后执行pod update gRPC-Core。排查Promise生命周期问题
崩溃原因是释放Activity时指针为空,说明iOS14.5的线程调度或内存模型导致Activity被提前释放:- 检查是否存在重复调用Activity销毁逻辑的情况,比如异步任务完成后多次触发释放
- 确保Promise的回调和Activity的销毁操作在正确的线程执行,避免跨线程的生命周期管理冲突
- 保证Activity的生命周期与绑定的Promise严格同步,不要在Promise未完成时提前销毁Activity
临时关闭断言(仅应急用)
如果暂时无法升级gRPC,可以通过编译选项关闭断言避免崩溃:
在Xcode的Build Settings中,为gRPC-Core添加预编译宏GRPC_DISABLE_ASSERTS=1。注意:关闭断言会隐藏潜在的逻辑问题,仅作为临时 workaround,最终仍需升级修复。线程安全校验
iOS14.5与iOS15的线程安全机制存在细微差异,检查是否在非线程安全场景下操作gRPC的Promise Activity:- 确保所有Activity的创建、销毁操作在同一线程执行,或用锁保护临界区
- 避免在后台线程随意释放仍在使用的Activity实例
内容的提问来源于stack exchange,提问作者Hassan Taleb
相关产品推荐
相关产品推荐

