ASM Bytecode跟踪Thread.start()方法

时间:2013-11-27 06:31:02

标签: bytecode java-bytecode-asm

我想跟踪,哪个方法调用java.lang.Thread.start()方法。 如何使用ASM字节码库实现它??

2 个答案:

答案 0 :(得分:0)

嗯,这在很大程度上取决于您想要跟踪的代码量:

  1. 您想知道您的应用程序的类在哪里调用Thread.start:然后您需要检测应用程序的所有类。
  2. 您想知道任何类调用Thread.start的位置,包括Java标准API的那些:那么您需要检验Thread无法实现的目标。
  3. 为了实现(1)目标,您可以注册一个Java agent (tutorial attached)来解析所加载的任何类的方法,并检查它们对Thread.start的调用。每当您发现这样的方法时,您需要为这些方法添加某种跟踪机制,例如调用System.out.printlnASM has an excelent tutorial他们甚至在方法字节代码一章中提供了类似的例子。此外,您可以使用ASMifier打印出您实际需要实施的代码。

    (2)目标更难实现。为了完成这项工作,您必须redefine the class for Thread,这可能会导致一些严重的问题,因为它是一个系统类。在Thread类中,您可以调用Thread.getStackTrace并检查当前调用堆栈顶部的方法名称,该名称由StackTraceElement表示。然后,您将再次启用跟踪此方法,例如调用System.out.println

    我会向您推荐第一个策略,因为这样更容易上班。此外,您可能会破坏JDK的使用许可,具体取决于您运行应用程序的位置。

答案 1 :(得分:0)

您可以编写自己的javaagent来转换所有方法。它应该搜索java.lang.Thread.start()调用并在它们之前添加日志记录。

因此,您应检查所有方法并查找以下字节码指令:

INVOKEVIRTUAL java/lang/Thread start ()V

并在说明之前插入类似的内容:

GETSTATIC java/lang/System out Ljava/io/PrintStream;
LDC ${current_method_name_and_desc}
INVOKEVIRTUAL java/lang/PrintStream println (Ljava/lang/String;)V