Skip to content

[fix] 修复 Incision 多插件 Bridge 串行执行与运行时隔离 - #725

Merged
Micalhl merged 1 commit into
TabooLib:dev/6.3.0from
FxRayHughes:fix/incision-bridge-routing
Jul 30, 2026
Merged

[fix] 修复 Incision 多插件 Bridge 串行执行与运行时隔离#725
Micalhl merged 1 commit into
TabooLib:dev/6.3.0from
FxRayHughes:fix/incision-bridge-routing

Conversation

@FxRayHughes

Copy link
Copy Markdown
Contributor

问题

PR #724 修复了跨 ClassLoader 的 Bridge 路由,但 Leaf 26.2 的真实双插件场景继续暴露出三类运行时问题:

  • 两个 Incision 插件切入同一方法时会重复物理织入,dispatcher 可能覆盖或重复执行,而不是按注册顺序各执行一次。
  • predicate 生成类依赖反射/JVMTI 定义进插件 ClassLoader,在 JDK 9+ 模块边界与多 native image 场景下不稳定。
  • side-car body 直接调用插件私有 JVMTI native 访问字段,第二个插件会因 native 绑定在另一 ClassLoader 而失败。

修改

  • 在 weaver 中识别已存在的 Bridge 入口;同一方法与 phase 仅保留一个物理入口,由 canonical Bridge 按注册顺序串行广播所有 dispatcher。
  • predicate 改为按 advice defining ClassLoader 隔离的弱缓存子 ClassLoader,不再依赖反射或 JVMTI DefineClass
  • side-car 私有字段访问统一经 bootstrap/system 中的 canonical IncisionBridge,并使用不生成额外内部类的弱缓存,遵守 bootstrap 注入只复制单个 class 的约束。
  • Instrumentation 路径不再读取 JVMTI 原始字节缓存,仅 JVMTI backend 使用 native baseline。
  • 补充 dispatcher 幂等织入、predicate loader 隔离、Bridge 字段访问与重入容器测试。

实际验证

  • ./gradlew :module:incision:test --no-daemon:20 项测试全部通过。
  • ./gradlew :module:incision:publishToMavenLocal -PdevLocal --no-daemon:成功。
  • Incision-Test ./gradlew clean build :bridge-peer:clean :bridge-peer:build --no-daemon:成功。
  • Leaf 26.2 build 42 / Java 25 双插件实测:373 pass / 0 fail / 1 not-applicable / 374 total
  • bridge-peer-dual-dispatchbridge-peer-disable-isolation 均通过,确认两个插件按注册顺序各执行一次,禁用 peer 后主插件仍可继续工作。
  • 日志中 dispatch unavailableNoClassDefFoundErrorVerifyErrorzip file closedUnsatisfiedLinkError、Bridge dispatch failure 均为 0。

对应集成测试已推送至 FxRayHughes/Incision-Test@c96e1c2

这是已合并 PR #724 的后续修复,没有对应的上游 Issue。

@Micalhl
Micalhl merged commit b848958 into TabooLib:dev/6.3.0 Jul 30, 2026
0 of 2 checks passed
@FxRayHughes

Copy link
Copy Markdown
Contributor Author

补充修复已推送(818f2169):

  • 删除 ManualSelfAttachSystem.setProperty("jdk.attach.allowAttachSelf", "true") 的运行时写入。
  • 仅尊重 JVM 启动时的 -Djdk.attach.allowAttachSelf=true 配置。
  • 失败时不再污染进程级属性;Instrumentation 不可用时仍按现有策略回退 JVMTI。
  • 同步更新 module/incision/TECHNICAL.md,说明 HotSpot 启动快照与 ByteBuddy 实时属性之间的差异。

本次变更针对 Issue #726,未改变 JVMTI native backend 的初始化和重转换路径。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants