java 代理 - 仪器选择的文件(排除所有内置 java 类 和方法)
java agent - Instrument selected files (exclude all inbuilt java classes and methods)
我正在编写我的第一个 java 代理。我正在尝试检测我从 git 存储库(不是我开发的)中挑选的项目。
我已经用 premain 方法编写了我的代理 class 并实现了一些日志记录(记录使用 ASM 字节码操作框架执行的行数)
但是,我发现即使是内置的 java 函数调用/ classes 也正在检测,这是不正确的。我只想检测项目中的文件。为此,我添加了一个过滤器,如下所示 -
public static void premain(String agentArgs, Instrumentation inst) {
System.out.println("Premain called");
inst.addTransformer(new ClassFileTransformer() {
public byte[] transform(ClassLoader classLoader,
String className,
Class<?> classBeingRedefined,
ProtectionDomain protectionDomain,
byte[] bytes)throws IllegalClassFormatException {
// ASM Code
if(className.startsWith("org/mytestpackage/")){
ClassReader reader = new ClassReader(bytes);
ClassWriter writer = new ClassWriter(reader, 0);
ClassTransformVisitor visitor = new ClassTransformVisitor(writer);
reader.accept(visitor, 0);
return writer.toByteArray();
}
return null;
}
});
}
添加此过滤器后,正在调用 premain,但出现一些异常
initializationError(org.mytestpackage.TestAllPackages) Time elapsed: 0.002 sec <<< ERROR!
java.lang.VerifyError: (class: org/mytestpackage/TestAllPackages, method: main signature: ([Ljava/lang/String;)V) Stack size too large
at java.lang.Class.getDeclaredMethods0(Native Method)
at java.lang.Class.privateGetDeclaredMethods(Class.java:2701)
at java.lang.Class.privateGetMethodRecursive(Class.java:3048)
at java.lang.Class.getMethod0(Class.java:3018)
at java.lang.Class.getMethod(Class.java:1784)
在我添加此过滤器之前(如果条件基于 className),我能够看到我的逻辑适用于内置 java classes 和方法。如果添加过滤器后失败。
感谢任何帮助,TIA。
您的 ClassTransformVisitor
似乎破坏了转换后案例的代码。在您的特定情况下,似乎没有调整 class org.mytestpackage.TestAllPackages
.
中方法的堆栈大小
验证器错误 Stack size too large
表示您向方法的操作数堆栈中压入的值多于您为此堆栈指定的槽。您可以通过指定 new ClassWriter(reader, ClassWriter.COMPUTE_MAXS)
.
要求 ASM 为您修复此问题
我正在编写我的第一个 java 代理。我正在尝试检测我从 git 存储库(不是我开发的)中挑选的项目。
我已经用 premain 方法编写了我的代理 class 并实现了一些日志记录(记录使用 ASM 字节码操作框架执行的行数)
但是,我发现即使是内置的 java 函数调用/ classes 也正在检测,这是不正确的。我只想检测项目中的文件。为此,我添加了一个过滤器,如下所示 -
public static void premain(String agentArgs, Instrumentation inst) {
System.out.println("Premain called");
inst.addTransformer(new ClassFileTransformer() {
public byte[] transform(ClassLoader classLoader,
String className,
Class<?> classBeingRedefined,
ProtectionDomain protectionDomain,
byte[] bytes)throws IllegalClassFormatException {
// ASM Code
if(className.startsWith("org/mytestpackage/")){
ClassReader reader = new ClassReader(bytes);
ClassWriter writer = new ClassWriter(reader, 0);
ClassTransformVisitor visitor = new ClassTransformVisitor(writer);
reader.accept(visitor, 0);
return writer.toByteArray();
}
return null;
}
});
}
添加此过滤器后,正在调用 premain,但出现一些异常
initializationError(org.mytestpackage.TestAllPackages) Time elapsed: 0.002 sec <<< ERROR!
java.lang.VerifyError: (class: org/mytestpackage/TestAllPackages, method: main signature: ([Ljava/lang/String;)V) Stack size too large
at java.lang.Class.getDeclaredMethods0(Native Method)
at java.lang.Class.privateGetDeclaredMethods(Class.java:2701)
at java.lang.Class.privateGetMethodRecursive(Class.java:3048)
at java.lang.Class.getMethod0(Class.java:3018)
at java.lang.Class.getMethod(Class.java:1784)
在我添加此过滤器之前(如果条件基于 className),我能够看到我的逻辑适用于内置 java classes 和方法。如果添加过滤器后失败。
感谢任何帮助,TIA。
您的 ClassTransformVisitor
似乎破坏了转换后案例的代码。在您的特定情况下,似乎没有调整 class org.mytestpackage.TestAllPackages
.
验证器错误 Stack size too large
表示您向方法的操作数堆栈中压入的值多于您为此堆栈指定的槽。您可以通过指定 new ClassWriter(reader, ClassWriter.COMPUTE_MAXS)
.