Java - 逐行"调试报告"



我正在构建的程序似乎在用户系统上的某些地方冻结了。当我测试相同的步骤时,我认为没有问题。尽管Java应该是一个独立于平台的虚拟机,但我猜它与我们使用的系统有关(我在linux上,用户在Mac上),可能与文件访问有关。

我无法访问用户的系统,用户也不知道调试意味着什么。为了测试问题出在哪里,我想把程序的进度写在一个文件中,当出现问题时让他把文件发给我。因此,我的问题是:

是否有某种库可以将程序的逐行执行写入文件?理想情况下,某些变量的值也将包括在内。

edit:我熟悉Logger,但(正如一个答案所说),这需要编写大量日志语句。有什么方法可以自动做到这一点吗?也许一行一行太夸张了,但像记录每个方法的入口/出口这样的东西肯定会起作用。

非常感谢!

这可能是面向方面编程的一个很好的用例。具体来说,Java的AspectJ库可能适合您的需要(还有其他库,但这是我最熟悉的库)。您可以定义一个日志方面,该方面将自动将方法进入/退出日志消息插入到要跟踪的方法中,而无需修改这些方法的代码。无论何时构建应用程序,都可以根据需要包含或排除方面(例如,在解决问题之前只为该用户包含它)。

以下内容可能是一个良好的开端:

aspect LogAllMethods {
  Log log = new Log(); // pseudocode -- replace with whatever logging mechanism you like
  before(): call(public * com.mycompany.*.*(..)) {
    log.log("Entered method: " + thisJoinPoint);
  }
  after(): call(public * com.mycomapny.*.*(..)) { 
    log.log("Leaving method: " + thisJoinPoint);
  }
} 

这基本上意味着,在包com.mycompany中的任何公共方法调用之前和之后,记录进入/退出和方法名称(thisJoinPoint是AspectJ中的一个特殊变量,指的是应用方面的程序执行点)。AspectJ文档中有一些关于定义方面以及如何使用方面的很好的教程和示例,以及关于如何将方面引入应用程序的说明。

对于您的情况和AspectJ的未充分利用来说,这可能有些过头了,但它应该允许您进行一些细粒度的调试,而不必向代码中的每个方法添加日志调用。

通常,您想要的调试信息将包含在日志文件中。日志记录API中内置的Java等日志记录框架允许您配置程序运行时要生成的消息的严重性。换句话说,您可以让它正常情况下只报告严重错误,但当您需要更多信息时,可以选择性地启用调试输出。

然而,日志记录框架通常要求程序员明确地告诉它要记录什么。它并不是简单地记录所有(这也会是很多数据!)。

听起来您想要的是登录应用程序。有关详细信息,请参阅维基百科上关于Java日志框架的文章。

上述文章中提到的一些更常见的日志记录框架是:

  • Log4J
  • Java日志API
  • Apache Commons日志记录
  • SLF4J

最新更新