You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 16:58:12