java agent - 仪器选择的文件(排除所有内置的java类和方法)

时间:2017-03-20 22:20:23

标签: java java-bytecode-asm javaagents

我正在编写我的第一个java代理。我正在尝试检测我从git repo中挑选的项目(不是我开发的)。

我用premain方法编写了我的Agent类并实现了一些日志记录(记录了使用ASM字节码操作框架执行的行数)

但是,我发现即使是内置的java函数调用/类也会被检测到,这是不正确的。我只希望对项目中的文件进行检测。为此,我添加了一个过滤器,如下所示 -

  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类和方法。如果在添加过滤器后失败。

感谢任何帮助,TIA。

1 个答案:

答案 0 :(得分:1)

您的ClassTransformVisitor似乎打破了已转换案例的代码。在您的特定情况下,它似乎不会调整类org.mytestpackage.TestAllPackages中方法的堆栈大小。

验证程序错误Stack size too large表示您将更多值推送到方法的操作数堆栈,而不是您为此堆栈指定的插槽。您可以通过指定new ClassWriter(reader, ClassWriter.COMPUTE_MAXS)来请求ASM为您解决此问题。