Java,如何跟踪调用的函数

时间:2011-01-13 06:44:54

标签: java trace

我想追查开始[& Java中调用的函数的结尾,如下面的代码:

    public void foo() {
  System.out.println("begin of foo()");
  ...
  System.out.println("e-n-d of foo()");
 }

但是维护转储代码System.out.println是一件单调乏味且容易出错的事情,因为一个类中可能有数十个函数。

任何好主意都可以缓解这项工作吗?我不想在整个文件中使用转储语句。

实施两者或其中一个开始&结束痕迹是最好的。
但是,如果不可能的话,已经调用该函数的记录也很有帮助。我的意思是不关心确切的开始和结束,只是告诉函数已被调用。

4 个答案:

答案 0 :(得分:9)

另一种方法是使用BTrace - 它类似于AspectJ,但可以附加到正在运行的java应用程序并动态应用日志代码(它也可以从应用程序中分离,删除所有注入的代码,但在使用 BTrace

之前让应用程序保持运行状态

为了使用 BTrace ,您可以编写一个简单的跟踪脚本,该脚本是使用 BTrace 注释注释的POJO(以及关于可以使用什么来避免崩溃的一些限制)目标应用)。

在这种情况下,脚本将如下所示:

@BTrace public class FooTracer {
  @OnMethod(clazz="Bar", method="foo")
  public static void onEntry() {
    println("begin of foo()");
  }

  @OnMethod(clazz="Bar", method="foo", location=@Location(Kind.RETURN))
  public static void onExit() {
    println("end of foo");
  }
}

使用 BTrace 可以做更多的事情 - 只需参阅用户指南和示例。名义上,它是控制台应用程序,但已集成到VisualVM,使得使用 BTrace 的体验更加愉快。

答案 1 :(得分:2)

最简单的方法是你选择的方法。

System.out调用的简单替代是使用日志框架。然后,您可以根据选定的“日志记录级别”打开和关闭信息

更复杂的解决方案将使用面向方面的编程技术(例如,由AspectJ提供),但这会让您陷入陡峭的学习曲线。

也许基于工具的方法可以满足您的需求:所谓的“分析器”可以“检测”您的代码并准确报告在运行期间调用的方法。

答案 2 :(得分:2)

如果有很多方法需要记录,可以使用 AOP 。例如,aspectJ。

答案 3 :(得分:0)

您可以使用log4j:

static Logger log = Logger.getLogger(
                      log4jExample.class.getName());

public void loggedMethod() {

 log.info("begin of loggedMethod()");
  ...
 log.info("e-n-d of loggedMethod()");
}