java运行时跟踪库替换system.out.println

时间:2010-12-29 23:31:45

标签: java debugging jvm aspectj tracing

您是否听说过任何允许我在运行时为特定方法设置跟踪的库?

我没有在我的代码中添加(并删除)大量System.out.println(并且必须重新编译和重新部署),而是希望有一个神奇的东西可以为每次调用打印一行选择的方法,代码没有任何变化。这可以在不重新编译的情况下工作,因此需要某种JVM代理(或者需要一些非标准的JVM?)。听起来像是方面编程的工作吗?

典型的情况是启动应用程序,动态配置跟踪方法(在单独的文件或类似文件中),然后每次调用所选方法时,其名称(和参数)的行打印到{{1 (或一些日志文件)。

当然人们可以想到几十个额外的功能,但这个基本设置将是一个很好的工具。顺便说一下,我也使用Eclipse交互式调试器,不仅使用System.out跟踪技术,而且两者都有一些优点,有时Eclipse还不够。

6 个答案:

答案 0 :(得分:4)

是的,你所指的是面向方面的编程。为Java提供此功能的典型库是AspectJ。您可以定义所谓的切入点,基本上是类和方法名称的正则表达式,包括通配符,以及在每个切入点处执行的代码,称为通知。这对于日志记录以及安全检查和类似的交叉问题非常有用。

您可以通过配置打开和关闭切入点建议。您可以在方法调用之前,返回之后或甚至在抛出异常之后执行建议。也有争议。

需要一个aspectj java代理才能工作。

答案 1 :(得分:1)

根据我的经验,这种非常详细的跟踪(比通常用于日志记录的更详细)作为调试技术表明单元测试和集成测试不充分。

答案 2 :(得分:1)

您可以使用名为InTrace的工具执行此操作。

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

答案 3 :(得分:0)

Log4J对于根据“日志级别”(DEBUG,INFO,WARN,FATAL)禁用日志记录非常有用。

您在配置文件中指定要在日志中显示的最低级别,例如,不要记录任何低于INFO级别的内容,以及瞧!

答案 4 :(得分:0)

看起来还有另一个解决方案 - 名为Byteman。用他们自己的话说:

  

Byteman是一个简化Java跟踪和测试的工具   程式。 Byteman允许您将额外的Java代码插入到您的   应用程序,无论是在JVM启动期间加载还是之后加载   它已经开始运行了。允许注入的代码访问   您的任何数据并调用任何应用程序方法,包括在哪里   他们是私人的。您几乎可以在任何地方注入代码   没有必要提前准备原始源代码也不需要   您必须重新编译,重新包装或重新部署您的应用程序。事实上   您可以删除注入的代码并重新安装不同的代码   应用程序继续执行。

答案 5 :(得分:0)

Jackplay是您正在寻找的工具。

它允许您在不进行任何编码或重新部署的情况下启用方法入口和出口点的登录。

它还允许重新定义方法体。它为您提供基于Web的UI作为控制面板,以在您的class.methods上启用或撤消跟踪。