【问题标题】:Asm bytecode queriesAsm 字节码查询
【发布时间】:2011-04-16 20:41:49
【问题描述】:

大家好, 我正在尝试使用 ASM 字节码 Tree Api 对类进行静态分析。 我想我有一个非常基本的问题。在一个说 foobar() 的方法中,我在 foobar 中有一个指令列表(InsnList 有一个列表)。现在我想检查是否在第 10 条指令处,是否调用了函数“barfoo(String args)”。

另外,我需要验证特定指令是否是条件指令。

感谢和问候, SJ

注意:我已经可以读取一个类并找到我感兴趣的特定方法并遍历该方法的每个指令。

已解决(参见:Greg 的 cmets):

    AbstractInsnNode s = ...
    if(s.getType()==AbstractInsnNode.METHOD_INSN){
        MethodInsnNode methodInvocationNode = (MethodInsnNode) s;
        if(methodInvocationNode.name.equals("barfoo"))
        {
            return true;
        }
    }

【问题讨论】:

  • 感谢 Chris.... dint 知道我们应该这样做.... 做 nw
  • 你知道各个JVM指令是什么意思吗?只是想弄清楚你从这里开始的地方。
  • 是的,我愿意……我已经阅读了 ASM 手册……
  • 那有什么问题呢?给定偏移量 10 处的指令,您应该知道如何确定那里的字节码是否正在调用特定函数。同样,给定一个特定指令,确定它是否是条件指令应该是微不足道的。
  • 没错,invokespecial是可以调用方法的字节码之一(还有几个)。看起来你必须在你的指令节点上调用getType(),如果类型是METHOD_INSN,那么你可以转换为MethodInsnNode。从那里,查看.name 以查看方法名称。

标签: java bytecode instrumentation bytecode-manipulation java-bytecode-asm


【解决方案1】:

通过查看 ASM javadoc,您似乎必须在指令节点上调用 getType(),如果类型是 METHOD_INSN,那么您可以转换为 MethodInsnNode。从那里,查看.name 以查看方法名称。

【讨论】:

    【解决方案2】:

    简单 - 一旦您确定调用了foobar,就开始在您访问的每条指令上增加一个计数器。在第十次调用时,检查barfoo 的调用。

    【讨论】:

    • 他不需要运行代码让访问者访问类/方法/指令。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-09
    • 2016-06-03
    相关资源
    最近更新 更多