如何退回到 Eclipse 调试器中?

是否可以在 Eclipse 调试器中执行反向执行?我正在从事的当前项目至少需要5秒钟从文件中读取和初始化数据,然后才能完成任何工作。如果在调试器中超出了限制,就必须终止程序并重新启动,这需要相当长的时间。

105884 次浏览

您可以使用 Eclipse 的 降到画面命令从顶部重新输入当前方法。但是它不会展开已经发生的任何状态更改,因此它可能无法工作,这取决于所使用的方法的类型。

另一个非常酷的工具是 全知调试器,它实际上可以让你在时间上来回走动。它通过在类加载器中加载类来工作,因此它可以记录代码执行的所有操作。它可以做一些很酷的事情,比如回答“何时、何地以及为什么这个字段被赋予了它的当前值?”.UI 相当笨重,并且很难处理大型代码库,但在某些情况下,它确实可以节省很多时间。

更新 : Chronon提供了一个商业产品,它将其描述为“ DVR for Java”,该产品似乎与 ODB 做了许多相同的事情。

我也在找日食的这个特征。我知道视觉工作室可以做到这一点。实际上,您可以拖动当前行标记并将其放回代码中的任何位置。我不太确定变量的更改是否可以撤消。但它仍然非常有用,即使这样,节省了很多时间。我等这一刻已经很久了。

除了前面的答案中提到的——比如,在 调试视图中 Eclipse 的下拉到帧特性,它在堆栈帧中更早地重新启动调试(但不恢复全局/静态数据) ,以及 全知调试器,它有点原始,不太发展——还有一些基于 Eclipse 的工具可以用来在(运行)时间内“返回”:

JIVE 扩展了 EclipseJava 调试器,能够记录程序状态。JIVE 透视图提供了一些有用的 UML 图,这些图在程序运行时被更新。这些关系图提供了应用程序状态(对象关系图)和堆栈跟踪(时序图)的概述。您可以查询已记录的跟踪,并在时间上前后移动,查看相应的图表。

Diver 只记录方法调用,并不像 JIVE 那样真正记录程序状态。每个方法调用事件都被存储起来,以便以后检索和分析。它扩展了 JavaRun 和 Debug 配置,主要用于指定过滤器。跟踪可以在运行时暂停/恢复/过滤。一旦记录下来,Diver 透视图就可以在交互式时序图中显示出来。

JIVE 和 Diver 是由学术研究发布的开源项目。截至2012年11月,这两个项目都很活跃。

Chronon 是一个商业产品,但是他们为学生和开源项目提供免费许可。从他们网站上的声明来看,这可能是最全面的记录器因为它能够重播记录的历史,来回走动,就像他们说的,可以进行时间旅行调试。此外,记录也不需要 Eclipse。

所有这些插件都是非常贪婪的资源,所以最好有一个良好的规格机和使用他们的过滤器功能。成功运行它们的一个明确要求是 扩展 eclipse.ini 中的堆空间

在我的例子中,我尝试使用 JIVE 和 Diver 来调试 XML 解析程序,但是由于缺乏资源,总是以冻结 eclipse 结束。Diver 可以是 在 linux 64位上运行很困难,它可以在 ubuntu32位发行版上工作,也可以在其他32位发行版上使用 这些小费。Diver 可以在 Windows 上工作,最好是在 Windows64位 + 64位 JVM 上,否则你将只能使用 32位窗口的最大堆空间为1.3 -1.6 Gb。JIVE 在我的 linux 64位上工作得很好,在其他平台上似乎也能很好地工作。

我是有偏见的,但 Chronon确实做你正在寻找。

拖放到 Frame 并不完全是回退,因为如果该方法已经更改了堆上的任何内容,它将不会被还原。

Yes ,Eclipse CDT 支持历史调试器特性。

打开 调试配置-> 调试器-> 启用反向调试 在启动时

然后你可以按 shift+F5shift+F6后退一步,如 F5F6前进一步。

这个问题没有指定一种 Eclipse 语言,许多答案都假定使用 Java。

如果在 GDB 调试器中使用 C + + 和 GCC,Eclipse 将使用 Run->Move to Line来完成这项工作,并使用 VisualStudioSet Next Statement 设置下一条语句这样的函数。在本例中,Eclipse 使用了 GDB 中的功能。

如果使用 Java,我不知道使用 Eclipse 或 Netbeans 的方法,尽管其他答案建议使用插件。Eclipse 确实有“ drop to frame”命令,在我的版本(Juno SR1)中,这个命令对 Java 有效。如果在调试模式下修改并保存函数中的代码,执行行将自动移动到当前函数的顶部,并且可以从那里继续。虽然与指定行不同,但它是有意义的。