m***@163.com
m***@163.com
  • 发布:29 分钟前
  • 更新:29 分钟前
  • 阅读:27

【报Bug】iOS UniMP SDK 小程序销毁竞态:bridge 线程派发已 dealloc 的 PGPlugin 导致 EXC_BAD_ACCESS

分类:uni小程序sdk

产品分类: uni小程序SDK

手机系统: iOS

手机系统版本号: iOS 26

手机厂商: 苹果

手机机型: iphone17

页面类型: vue

SDK版本号: 4.75

操作步骤:

某一 uni 小程序"进入→关闭"必崩,其他小程序不崩。崩溃线程 com.taobao.weex.bridge,EXC_BAD_ACCESS (code=1, address=0x68b77be81b53c8)。wifi下不崩,用流量崩

预期结果:

小程序正常开启关闭

实际结果:

app崩溃

bug描述:

崩溃栈:

code
0 objc_msgSend
1 -[PDRCoreFeature Execute:]
2 -[PDRCoreApp handleCmds:]
3 -[PDRCoreAppFrame webViewEngine…]
4 -[H5WeexWebview handleMessage:withObject:]
6 -[WXSDKInstance(DCPlusBridge) …]
7 -[PlusWeexModule execSync:]
10 -[WXModuleMethod invoke]
寄存器(frame 0):x0 = x22 = 0x146aa1480(getCommandInstance 返回的插件实例,已悬垂),x1 = "resultWithInt:"(PGPlugin 方法)。

反汇编证据:-[PDRCoreFeature obj:Execute:] 以尾调用 b objc_msgSend 派发插件方法;插件方法(如 -[PGNavigator getStatusbarHeight:]、-[PGNStorage JSNStorage_getLength:] 等)尾调用 resultWithInt:,两层尾调用折叠栈帧,与崩溃栈形态完全吻合。即 Execute:(PDRCoreFeature.m:770 附近)从命令表取到的 PGPlugin 指针已被释放。

同根因历史形态:插件内存被 Foundation 复用时报 -[NSThreadPerformInfo resultWithString:]: unrecognized selector。

根因分析:小程序销毁流程 dealloc 插件实例时,未等待/排空 weex.bridge 队列上存量 execSync 调用;PDRCoreFrameJSObjects/PDRCoreGlobalJSObjects 命令表持裸指针,销毁后仍被取出派发。

诉求:① 销毁流程先 drain/join bridge 队列再释放插件,或命令表改弱引用/失效标记;② 确认哪个 SDK 版本已修复该时序,便于升级。宿主侧目前已用运行时守卫在 getCommandInstance: 层拦截悬垂指针止血,但闭源内部时序无法根治。

29 分钟前 负责人:无 分享
已邀请:

要回复问题请先登录或注册