1

注意:实际上,我会发布一个答案,但欢迎任何其他建议!

这个问题需要一些背景信息,以防止评论质疑我的目标...... :-)

在我工作的地方,我们使用了大量的调试,主要是用 Eclipse 完成的。我知道有些人质疑调试的做法,声称良好的设计和分析以及适当的单元测试可以很容易地剖析错误。

好吧,我在 Java 1.2(甚至 1.1)是最新版本时设计的遗留应用程序的大型代码库(Java / Swing)上工作,并且代码有很多麻烦,即使经过多年的工作,我不能假装知道超过10%!我们拥有的 JUnit 测试最多只能覆盖 1% 的代码(这是最近的实践……)。

因此,使用好的调试器对于检查类、其中的数据、软件的行为以及我们提供的数据类型等非常重要。

然而,逐步有其局限性:它可能很慢,我们可能会遗漏一些东西,并且在某些情况下是不切实际的,例如查看 paint() 方法或使用多线程部分。

所以我习惯了,在这些困难的情况下,System.out.println()到处散布一些语句,看看调用了什么方法,使用什么参数,以什么顺序等。我可以使用日志,但这种方式更简单,并且问题解决后,我删除了这些行。

这种做法的一个问题是我们必须在提交之前仔细检查差异以消除这些行。另一个问题是我们使用 Perforce 作为 VCS,这很好,但需要显式检出文件(将其状态从只读更改为可写)以添加此类跟踪。它很慢(使用 Eclipse P4 插件)并且很麻烦。

所以,我的问题是:是否可以在不更改源代码本身的情况下将上下文跟踪添加到某些代码点?每次运行一行时都可以记录“我在这里,我看到了”的东西。

我最初搜索了一个 Eclipse 插件,只找到了一个 C 调试器的建议,并找到了(我认为在 SO 中的评论中,但我失去了参考,唉)我将在下面发布一个解决方案,希望它可以对其他人有用。如上所述,任何替代方案都可以采用。

4

2 回答 2

3

在 Eclipse 中不需要插件:在要跟踪的行中添加断点,使其有条件(例如 Ctrl+双击边距中的断点图标;或者右键单击 BP 中的 BP 行列表并选择Breakpoint Properties),方法是Conditional选中复选框并保留该Suspend when 'true'选项。

然后粘贴类似:

System.out.println("ClassName.methodName: " + parameter);
return false;

上下文自动完成工作(提醒:sysout后跟 Ctrl+空格扩展为System.out.println()),您可以打印出当前线程名称,以及其他有用的信息。

return false;行告诉 Eclipse 实际上不要在此断点处停止。所以运行“条件”代码,Eclipse 继续运行代码。

我担心它会减慢代码的速度,但是对于现代计算机,它在人类水平上是无法察觉的。

注意:由于某种原因,当我在 之后键入分号false时,Perforce 插件想要签出当前文件。当然,您可以取消此操作。如果你粘贴这条线,它不会反应......

于 2012-12-21T12:23:00.417 回答
1

看看BTrace。您可以编写条件调试/跟踪代码,并在开发期间将其附加到正在运行的 JVM。在生产中,此代码将根本不存在。

于 2012-12-21T12:26:42.380 回答