Java - 逐行'调试报告'

时间:2012-02-26 17:02:12

标签: java debugging

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

我无法访问用户的系统,用户也不知道调试意味着什么。为了测试问题所在,我正在考虑将程序的进度写入文件,让他在出现问题时将文件发送给我。因此我的问题是:

是否有某种类型的库允许逐行执行程序写入文件?理想情况下,也会包含某些变量的值。

编辑:我熟悉Logger,但(如同一个答案所说),这需要编写大量的日志语句。有没有办法自动完成这个?也许一行一行是矫枉过正的,但是记录每个方法的进入/退出肯定会有用。

非常感谢!

3 个答案:

答案 0 :(得分:3)

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

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

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的利用不足,这可能有点过头了,但它应该允许你做一些细粒度的调试,而不必为代码中的每个方法添加日志调用。

答案 1 :(得分:0)

通常,您需要的调试信息将包含在日志文件中。像Logging API内置的Java这样的日志框架允许您配置程序运行时要生成的消息的严重性。换句话说,您可以让它通常仅报告严重错误,但在需要更多信息时有选择地启用调试输出。

但是,日志记录框架通常要求程序员明确告诉它要记录什么。它不仅仅记录所有内容(这也是很多数据!)。

答案 2 :(得分:0)

听起来你想要的是登录你的应用程序。有关详细信息,请参阅维基百科有关Java Logging Frameworks的文章。

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