diff --git a/module/incision/TECHNICAL.md b/module/incision/TECHNICAL.md index 2c9a9a3ec..2ab7a90ca 100644 --- a/module/incision/TECHNICAL.md +++ b/module/incision/TECHNICAL.md @@ -192,7 +192,7 @@ private fun resolve(): Instrumentation? { **self-attach 的固有阻碍**: -- JDK 9+:默认 `jdk.attach.allowAttachSelf=false`,需显式打开 +- JDK 9+:默认禁止当前进程 attach 自身;如需启用,必须在 JVM 启动参数中设置 `-Djdk.attach.allowAttachSelf=true`。Incision 不会在运行时修改这个进程级属性,因为 HotSpot 读取的是启动快照,而 ByteBuddy 等库读取实时属性,修改会造成策略分裂并影响其他插件 - JDK 21+:无 `-XX:+EnableDynamicAgentLoading` 时打印警告并最终禁止 - Paper/Spigot 生产配置:常以安全硬化名义禁用 self-attach - 精简 JRE:可能缺 `tools.jar` 或 `jdk.attach` 模块 diff --git a/module/incision/src/main/kotlin/taboolib/module/incision/loader/attach/ManualSelfAttach.kt b/module/incision/src/main/kotlin/taboolib/module/incision/loader/attach/ManualSelfAttach.kt index 20f251f3b..c5fe4270f 100644 --- a/module/incision/src/main/kotlin/taboolib/module/incision/loader/attach/ManualSelfAttach.kt +++ b/module/incision/src/main/kotlin/taboolib/module/incision/loader/attach/ManualSelfAttach.kt @@ -21,7 +21,8 @@ import java.util.jar.Manifest * * JDK 9+: * - 直接使用内建 `com.sun.tools.attach`(jdk.attach 模块) - * - 若进程未启用 `jdk.attach.allowAttachSelf=true`,尝试动态 set 系统属性后再 attach + * - 只有 JVM 启动时已启用 `jdk.attach.allowAttachSelf=true` 才允许进程内 attach; + * 运行时修改该属性不会改变 HotSpot 的启动快照,且会误导其他插件的 attach 策略。 */ object ManualSelfAttach { @@ -33,9 +34,6 @@ object ManualSelfAttach { fun attach(): Instrumentation { captured?.let { return it } - // 启用 self-attach(JDK 9+) - System.setProperty("jdk.attach.allowAttachSelf", "true") - val vmClass = loadVirtualMachineClass() val pid = currentPid().takeIf { it > 0 } ?: throw Trauma.Attach.InstrumentationUnavailable("无法获取当前进程 PID")