PyCharm JVM Crash 分析 — ja-netfilter itable 破坏 (2026-06-09)

PyCharm 2025.3 JVM Fatal Crash 分析

Date: 2026-06-09 09:51
JRE: JBR-21.0.8+9-1163.69-jcef
Host: AMD Ryzen 7 7840U, 16 cores, 59GB, Windows 10 19041.6807
PID: 22288, elapsed time: 39m 26s

崩溃现场

EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x00007ffb5bffcd91
reading address 0x0000000000000118
Current thread: GC Thread#8
Problematic frame: V  [jvm.dll+0xcd91]

反汇编崩溃点(jvm.dll+0xcd91):

49 8b 00          mov    rax, [r8]         ; rax = *r8 (load object header)
49 8b c8          mov    rcx, rax           ; rcx = rax (klass pointer)
48 ff a0 00 01 00 00  jmp   qword [rax+0x100]  ; attempt itable dispatch

RAX=0x18(24),访问 [0x18+0x100]=0x118 → AV

根因

ja-netfilter-2025.3.0 JVMTI agent 在 JBR 21.0.8 上破坏 itable 元数据

  • agent 路径:D:\softWin\installer\JetbrainsActivate\ja-netfilter\ja-netfilter-2025.3.0\ja-netfilter.jar
  • 通过 ASM 字节码修改 JetBrains license 验证类的虚函数表
  • hook 过程中 itable 指针被覆写为 0x18,GC 线程遍历对象时 crash
  • hs_err 日志 L2007 确认 agent loaded, initialized

辅助证据

  • 崩溃线程是 GC Thread#8—元数据破坏的典型发现者,不是制造者
  • RAX=0x18 是极小的整数,不可能是合法堆指针—正是 itable 被覆盖的特征
  • hs_err 打印线程列表时自身也二次 crash(L276),说明错误传播
  • heap 使用约 1GB / 2GB,无 OOM 迹象

排除顺序

  1. 验证:注释 -javaagent: 行重启 PyCharm(进入试用模式)确认不再崩溃
  2. 更新 ja-netfilter:查 GitHub releases 看是否有新版兼容 JBR 21
  3. 回退:恢复到 JBR 21.0.6 等早期版本
  4. 换方案:改用不通过 JVMTI instrumentation 修改字节码的激活方式

VM 配置

Custom VM options (C:\Users\cat\AppData\Roaming\JetBrains\PyCharm2025.3\pycharm64.exe.vmoptions):

--add-opens=java.base/jdk.internal.org.objectweb.asm=ALL-UNNAMED
--add-opens=java.base/jdk.internal.org.objectweb.asm.tree=ALL-UNNAMED
-javaagent:D:\softWin\installer\JetbrainsActivate\ja-netfilter\ja-netfilter-2025.3.0\ja-netfilter.jar