在java中调用跟踪

有没有办法在java中输出特定线程的调用跟踪?

我不想要堆栈跟踪。 我想在每个对象上进行一系列调用以进行跟踪。

有btrace ,可以用于这种行为。

我想你可能会发现这很有趣。 它是一个java代理,它为方法添加入口和出口日志记录,使用slf4j框架实际记录输出。 然后,配置日志框架只打印出您感兴趣的线程。

http://www.slf4j.org/extensions.html#javaagent

(只是为了明确:1)我写了它,2)它对我有用:))

如果要跟踪Java代码的执行,可以使用名为InTrace的工具。

注意:InTrace是我编写的免费开源工具。

您基本上需要某种forms的面向方面编程,其中方面可以确定当前线程是否是要记录调用。 (另一种方法是自己明确地将记录放在每个方法中,这将是痛苦的。)

Java中有很多AOP框架,比如AspectJ和Spring (Spring当然比AOP要多得多)。

将方面应用于系统中的每个方法调用都可能很棘手……虽然我没有使用AspectJ的任何经验,但Spring AOP基本上是为了在组件周围启用AOP。 Spring无法有效识别的类不容易改变。 请注意,自从我使用了Spring AOP以来已经有一段时间了 – 从那时起事情可能会发生:)

我们可以创建一个新的Throwable对象,它将具有调用跟踪。 使用一些字符串操作,我们可以获得调用堆栈。

Throwable t = new Throwable(); System.out.println(t.getStackTrace()[1].toString()); 

我不确定以这种方式检索信息,这是一个很好的做法。 🙂

Runtime.traceMethodCalls() ,它为所有线程中所有对象的每个方法调用打印一行

比Btrace使用HouseMD更容易的方法,你可以从这里得到