Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java,如何跟踪调用的函数_Java_Trace - Fatal编程技术网

Java,如何跟踪调用的函数

Java,如何跟踪调用的函数,java,trace,Java,Trace,我希望跟踪Java中调用的函数的开头[&结尾],如以下代码所示: public void foo() { System.out.println("begin of foo()"); ... System.out.println("e-n-d of foo()"); } 但是维护dump codeSystem.out.println是一件乏味且容易出错的事情,因为一个类中可能有几十个函数 有什么好主意可以简化这项工作吗?我不想让文件里到处都是转储语句 执行两个或一个开始和结

我希望跟踪Java中调用的函数的开头[&结尾],如以下代码所示:

    public void foo() {
  System.out.println("begin of foo()");
  ...
  System.out.println("e-n-d of foo()");
 }
但是维护dump code
System.out.println
是一件乏味且容易出错的事情,因为一个类中可能有几十个函数

有什么好主意可以简化这项工作吗?我不想让文件里到处都是转储语句

执行两个或一个开始和结束跟踪。

但是,如果不可能的话,记录函数被调用的情况也是有帮助的。我的意思是不在乎确切的开始和结束,只要告诉你函数已经被调用。

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

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

更复杂的解决方案将使用面向方面的编程技术(例如,AspectJ提供),但这将使您处于一个陡峭的学习曲线上


也许基于工具的方法适合您的需要:所谓的“探查器”可以“插入”您的代码并准确报告在运行期间调用的方法。

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

您可以使用log4j来实现以下目的:

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

public void loggedMethod() {

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

另一种方法是使用-它有点类似于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,您可以做更多的事情-请参阅《用户指南》和示例。名义上,它是一个控制台应用程序,但它与使用BTrace的体验相结合,使之更加愉快。

就其价值而言,我相信AspectJ适用于此类应用程序。它将使用您指定的挂钩修改编译的字节码。我从未使用过它,但我认为它确实如此。我认为后者是最可取的,因为我怀疑这种行为在生产代码中是否可取,为什么要用AOP重新发明轮子呢。类似于tptpforeclipse的东西应该能够提供所有函数调用甚至计时的转储。输出可能是某种二进制格式,但考虑到它可能非常庞大,这可能没问题。我不会在这些函数上附加任何代码,因为这不是我的代码,需要做很多工作。AspectJ可能会起作用。但什么是“剖析器”,什么是基于工具的方法,你能给出一个例子或链接吗。那将非常感谢。提前谢谢。@CurtainDog:非常感谢。的确,我需要一个与语言相关的解决方案。@user435657-您的意图是什么?探查器(如)总是附带报表查看器,它们旨在支持分析任务。您不必编写一行代码-只需从探查器启动应用程序,它会记录所有方法调用。很抱歉,我的意思是,不要提供任何附加代码来记录/记录函数已被调用。你好!如果使用aspectJ,我应该在这些函数中附加传统代码吗?不需要用Java编写额外的代码。在aspectJ中编写日志代码,然后将aspectJ代码与Java字节码混合,这个过程称为“wave”。一个简单的例子: