2010-12-02 81 views
112

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

回答

120

您可以使用Eclipse的drop to frame命令从顶部重新输入当前方法。但它不会展开任何已发生的状态变化,所以它可能无法正常工作,具体取决于您所使用的方法。

另一个非常酷的工具,实际上可以让您及时退后一步, Omniscient Debugger。它通过在加载类加载器时加载类来工作,因此它可以记录代码执行的所有操作。它可以做很酷的事情,比如回答“何时,何地,为什么这个字段指定了它的当前值?”。用户界面非常笨重,处理大型代码库可能很难,但在某些情况下,它可以节省很多时间。

更新Chronon提供了一个商业产品,它描述为“DVR for Java”,它看起来与ODB有很多相同的功能。

+6

+1,下降到帧是你想尝试。 – 2010-12-02 03:53:22

+0

@Matt McHenry我试图使用ODB1.5;与独立的Java程序,但我不知道如何让它的工作?除ODB网站外,您是否还有其他资源可以解释使其独立工作并与Eclipse一起工作的步骤? – Ayusman 2012-08-30 23:20:52

+0

@Ayusman:不,我很抱歉,除了ODB网站上的内容外,我没有任何东西可以分享。如果它不适用于更新的.class文件格式等等,我不会感到惊讶。 :( – 2012-08-31 03:51:12

3

我也在eclipse中寻找这个特性。我知道视觉工作室可以做到这一点。实际上,您可以拖动当前线标记并将其放回代码中的任何位置。我不确定变量的变化是否可以撤销。但它仍然非常有用,并节省大量时间。我一直在等待这个日食很长时间。

44

除了早些时候的答案中提到的东西 - 即Eclipse的掉帧函数debug view,它重新开始在堆栈帧中更早的调试(但不恢复全局/静态数据)和Omniscient debugger,这有点粗糙这么多的演变 - 有可能被用于(运行)的时间“返回”一些基于Eclipse的工具:

JIVE扩展了Eclipse Java调试器,能够记录程序状态。 JIVE透视图提供了一些在程序运行时更新的有用的UML图。这些图表提供了应用程序状态(对象图)和堆栈跟踪(序列图)的概述。您可以查询记忆的轨迹并及时后退和前进,并查看相应的图表。

潜水员只记录方法调用,并没有真正记录像JIVE一样的程序状态。每个方法调用事件都会被存储以供以后检索和分析。它扩展了Java运行和调试配置,主要是为了指定过滤器。跟踪可以在运行时暂停/恢复/过滤。一旦记录,Diver透视图可以在交互式顺序图中显示它。

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

Chronon是一个商业产品,但他们有免费的学生和开源项目许可证。从他们的网站上声称,它可能是最全面的录音机,因为它能够重放录制的历史记录,来回一次,允许他们说时间旅行调试。另外Eclipse不需要录制。

所有这些插件都相当贪婪的资源,所以最好有一个很好的规格机器和使用他们的过滤器功能。成功运行它们的明确要求是extend the heap space in eclipse.ini

在我的情况下,我试图使用JIVE和Diver来调试一个XML解析程序,但总是因为缺乏资源而导致eclipse冻结。潜水员可能是tricky to run on linux 64bit,它可以在ubuntu 32bit上运行,也可能在其他32bit发行版上运行,使用these tips。 Diver可以在Windows上运行,但在Windows 64bit + 64bit JVM上运行得更好,否则您将被限制为maximum heap space of 1.3-1.6Gb on 32bit windows。 JIVE在我的linux 64bit上效果很好,而且在其他平台上似乎可以正常工作。

5

我有偏见,但Chronon完全是你在找什么。

拖放到框架并没有完全退后,因为如果方法改变了堆上的任何东西,它将不会被还原。

10

是的,Eclipse CDT支持历史调试功能。

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

比你可以一步按shift+F5shift+F6回来就好F5F6的一步。

1

该问题没有指定Eclipse语言,许多答案都假设为Java。

如果在GDB调试器中使用C++和GCC,Eclipse有Run->Move to Line,它的作用和功能类似于Visual Studio Set Next Statement。在这种情况下,Eclipse正在使用GDB中的功能。

如果使用Java,我不知道使用Eclipse或Netbeans的方式,尽管其他答案都提示插件。 Eclipse确实有适用于我的版本(Juno SR1)的Java的“drop to frame”命令。如果我在调试模式下修改和保存函数中的代码,执行行自动移动到当前函数的顶部,我可以从那里继续。与指定线不同,但它是某种东西。