我想跟踪,哪个方法调用java.lang.Thread.start()方法。 如何使用ASM字节码库实现它??
答案 0 :(得分:0)
嗯,这在很大程度上取决于您想要跟踪的代码量:
Thread.start
:然后您需要检测应用程序的所有类。Thread.start
的位置,包括Java标准API的那些:那么您需要检验Thread
无法实现的目标。为了实现(1)目标,您可以注册一个Java agent (tutorial attached)来解析所加载的任何类的方法,并检查它们对Thread.start
的调用。每当您发现这样的方法时,您需要为这些方法添加某种跟踪机制,例如调用System.out.println
。 ASM 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