当前位置: 首页 > 知识库问答 >
问题:

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

淳于开畅
2023-03-14

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

我已经用premain方法编写了代理类,并实现了一些日志记录(使用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类和方法的逻辑工作。如果添加筛选器后失败。

共有1个答案

叶越
2023-03-14

您的classtransformVisitor似乎破坏了您转换后的案例的代码。在您的特定情况下,似乎不会调整org.myTestPackage.testAllPackages类中方法的堆栈大小。

验证器错误stack size too large表示您向方法的操作数堆栈中推送的值比为该堆栈指定的插槽多。您可以通过指定new ClassWriter(reader,ClassWriter.compute_maxs)来要求ASM为您修复此问题。

 类似资料:
  • 本文向大家介绍Java删除指定文件夹下的所有内容的方法(包括此文件夹),包括了Java删除指定文件夹下的所有内容的方法(包括此文件夹)的使用技巧和注意事项,需要的朋友参考一下 如下所示: 以上这篇Java删除指定文件夹下的所有内容的方法(包括此文件夹) 就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持呐喊教程。

  • 我正在使用meanstack应用程序。所以我有mongodb系列,其中包含全球各地的位置。模式loook如下所示。 选择圆内所有点(预定义点和预定义半径)的有效方法是什么。。?? 使用SQL查询也可以做到这一点。但我想要一种有效的方法,不需要逐个迭代,检查它是否在该半径内。

  • 我比第一个更喜欢它,因为: 您可以直接在顶部输入您的文件路径 您可以搜索文件夹 左边的直接访问包含整个文件树 如何在 Java 中获取它?

  • 我在让我的排序检查每个索引时遇到问题。它跳过了的第三个索引,因为它去了,,到,我不知道它为什么这样做?。此外,我的数字实际上被交换时遇到了问题。有人知道我的错误在哪里吗?

  • 预期:[硬币[价值=1.0,名称=美元],硬币[价值=0.25,名称=四分之一],硬币[价值=0.1,名称=一角硬币],硬币[价值=0.05,名称=镍],硬币[价值=0.01,名称=便士]]

  • 假设当前存在一个 int 类型的数组 number,该数组中的元素依次是 13、15、 24、99、4 和 1。如果使用冒泡排序进行两两相邻比较,第一趟排序后的结果如下: 第二趟排序后的结果如下: 第三趟排序后的结果如下: 第四趟排序后的结果如下: 第五趟排序后的结果如下: 使用选择排序法也可以对上述数组中的元素进行排序,但是它与冒泡排序不同。 选择排序是指每一趟从待排序的数据元素中选出最大(或最