Java - 逐行 'debug report'

标签 java debugging

我正在构建的程序似乎在用户系统的某些点上卡住。当我测试完全相同的步骤时,我发现没有问题。尽管 Java 应该是独立于平台的 VM,但我的猜测是它与我们使用的系统有关(我在 linux 上,用户在 Mac 上),也许与文件访问有关。

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

是否有某种库允许将程序的逐行执行写入文件?理想情况下,还包括某些变量的值。

编辑:我熟悉 Logger,但是(如一个答案所说),这需要编写大量日志语句。有什么方法可以自动执行此操作吗?也许逐行是矫枉过正,但像记录每个方法进入/退出这样的东西肯定会起作用。

非常感谢!

最佳答案

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

类似下面的内容可能是一个好的开始:

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 中调用任何公共(public)方法之前和之后,记录入口/导出和方法的名称(thisJoinPoint 是AspectJ 中的一个特殊变量,它指的是应用方面的程序执行中的点)。 AspectJ 文档有一些很好的教程和示例,用于定义方面以及如何使用它们,以及有关如何将方面引入您的应用程序的说明。

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

关于Java - 逐行 'debug report',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9455108/

相关文章:

java - adb 找不到我的设备进行 Android 调试。为什么?

linux - 我如何找出本地套接字另一端的程序?

xcode - xcode7 调试器发生了什么变化,我无法再使用 "po"/Swift 查看变量

java - Mockito - 模拟库调用

java - 无法检测现有电话号码

Java:本地搜索 TSP 错误

java - 将选项传递给 chrome 驱动程序 selenium

java - 在 SQL 数据库中存储 HashMap

python - 如何远程调试 Django 应用程序?

node.js - 是否可以使用通用调试器(gdb、lldb 等)在 Electron 应用程序中调试 Node c++ 插件?