问题描述
我正在尝试开发一个 javaagent
。它还提供对注释的支持。
在 preMain
方法中,我试图扫描类路径以获取注释。然后使用 instrumentatino.addTransformer()
方法添加转换器。
因为在注释处理期间类已经加载,转换不会发生(如果我删除注释处理代码和重新转换代码{见下文},一切正常)。
为了克服这个问题,我现在正在尝试重新转换类。与清单条目和启用 canRetransform
方法中的 addTransformer
标志相关的所有必要设置都已完成。
我的代码大致如下:
annotationProcessor.processAnnotation();
instrumentation.addTransformer(new DummyTransformer(),true);
try {
instrumentation.retransformClasses(instrumentation.getAllLoadedClasses());
} catch (UnmodifiableClassException e) {
e.printstacktrace();
}
DummyTransformer
不做任何事情。它只是按原样返回 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
会产生类似的结果。
解决方法
问题是我试图使用 select sum(sale)
from ..
group by date
重新转换所有类。相反,我根据包名称过滤掉了我感兴趣的类,并且它可以使用一组有限的类。
也许有些类被加载了,但不应该被重新转换。