instrumentation.retransformClasses() 抛出致命错误

instrumentation.retransformClasses() throwing fatal error

我正在尝试开发 javaagent。它还提供对注释的支持。

preMain 方法中,我试图扫描类路径中的注释。然后使用 instrumentatino.addTransformer() 方法添加变压器。

因为 类 在注释处理期间已经加载,转换不会发生(如果我删除注释处理代码和重新转换代码{见下文},一切正常)。

为了克服这个问题,我现在正在尝试重新转换 类。所有与清单条目相关的必要设置以及在 addTransformer 方法中启用 canRetransform 标志已完成。

我的代码大致如下所示:

annotationProcessor.processAnnotation();
instrumentation.addTransformer(new DummyTransformer(), true);
try {
  instrumentation.retransformClasses(instrumentation.getAllLoadedClasses());
} catch (UnmodifiableClassException e) {
  e.printStackTrace();
}

DummyTransformer 什么都不做。它只是 returns classBytes 的原样(我也尝试在每次调用时返回 null)

这里发生的是我收到此错误

#
# A fatal error has been detected by the Java Runtime Environment:
#
#  SIGSEGV (0xb) at pc=0x000000010c5254dd, pid=5912, tid=0x0000000000001603
#
# JRE version: OpenJDK Runtime Environment (8.0_282) (build 1.8.0_282-bre_2021_01_20_16_06-b00)
# Java VM: OpenJDK 64-Bit Server VM (25.282-b00 mixed mode bsd-amd64 compressed oops)
# Problematic frame:
# V  [libjvm.dylib+0x5254dd]  Symbol::as_C_string() const+0xd
#
# Failed to write core dump. Core dumps have been disabled. To enable core dumping, try "ulimit -c unlimited" before starting Java again
#
# An error report file with more information is saved as:
# /some/obfuscated/path/hs_err_pid5912.log
#
# If you would like to submit a bug report, please visit:
#   http://bugreport.java.com/bugreport/crash.jsp
#
zsh: abort      java  -cp build/libs/jvm-agent-0.1-all.jar 

最初我认为转换器运行不正常,但当我用 DummyTransformer 进行实验时,返回 null 或相同的 bytes 会产生类似的结果。

问题是我试图使用 instrumentation.getAllLoadedClasses() 重新转换所有 类。相反,我根据包名称过滤掉了我感兴趣的 类 并且它使用了一组有限的 类.

可能有一些 类 已加载但不应该重新转换。