如何在Eclipse调试器中后退?

134

在Eclipse调试器中进行反向执行是否可能? 我目前正在处理的项目需要至少5秒钟才能从文件中读取和初始化数据,然后才能执行任何操作。如果我在调试器中超越了这个过程,那么我就必须终止程序并重新启动,而这需要相当长的时间。

6个回答

阿里云服务器只需要99元/年,新老用户同享,点击查看详情
138
你可以使用Eclipse的跳转到帧命令从顶部重新进入当前方法。但它不会撤消已发生的任何状态更改,所以它可能无法按照您所在的方法类型工作。 另一个真正酷的工具是Omniscient Debugger,它实际上让您可以向前和向后步进时间。它通过在类加载器中加载类来进行检测,因此可以记录代码执行的所有内容。它可以做很酷的事情,比如回答“这个字段何时、何地以及为什么被分配了当前值?”界面相当笨重,而且处理大型代码库时可能会遇到困难,但对于某些情况,它确实可以节省很多时间。 更新Chronon提供一种商业产品,将其描述为Java的“DVR”,似乎做了与ODB相同的许多事情。

@Matt McHenry 我正在尝试使用ODB1.5;与一个独立的Java程序,但我不确定如何让它工作?除了ODB网站之外,您是否有其他资源可以解释使其独立工作并与Eclipse一起使用的步骤? - Ayusman
@Ayusman:不好意思,除了ODB网站上已经公布的内容外,我没有其他可以分享的了。如果它不能处理较新的 .class 文件格式等其他问题,我也不会感到惊讶。 :( - Matt McHenry
似乎 Omniscient Debugger 的网站已经被域名抢注了。 - Thorbjørn Ravn Andersen

47
除了前面提到的内容,即Eclipse在调试视图中的“倒回到帧”功能(重新启动之前的堆栈帧调试但不恢复全局/静态数据)和Omniscient debugger(比较原始且不太发展) - 还有一些基于Eclipse的工具可用于“返回”(运行)时间:

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

Diver只记录方法调用,不像JIVE一样记录程序状态。每个方法调用事件都被存储以供后续检索和分析。它主要扩展Java运行和调试配置来指定过滤器。跟踪可以在运行时暂停/恢复/筛选。一旦记录完成,Diver透视图可以以交互式序列图的形式显示。

JIVE和Diver是从学术研究中发布的开源项目。截至2012年11月,两个项目都在积极维护更新。

Chronon是商业产品,但他们为学生和开源项目提供免费许可证。根据其网站上的介绍,Chronon可能是最全面的记录器,因为它能够重播记录的历史记录、前进和后退,并允许所谓的时间旅行调试。此外,Chronon不需要Eclipse进行录制。

所有这些插件都相当占用资源,因此最好使用良好的计算机规格并使用它们的过滤器功能。成功运行它们的明确要求是在eclipse.ini中扩展堆空间

就我的情况而言,我尝试使用JIVE和Diver调试XML解析程序,但由于资源不足而导致Eclipse经常卡顿。Diver可能会在Linux 64位上运行有些麻烦,它可以在Ubuntu 32位上运行,并且可能在其他32位发行版上使用这些提示。Diver可以在Windows上工作,尤其是在Windows 64位+64位JVM上,否则您将受到32位Windows上1.3-1.6GB的最大堆空间限制。JIVE在我的Linux 64位上运行良好,并且似乎在其他平台上也正常运行。


Diver已经停止开发。 - merours

15

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

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

然后您可以按shift+F5shift+F6以回退步骤,就像使用F5F6一样前进。


1
这个选项在所有版本的Eclipse中都存在吗?我找不到它的任何地方。 - DeejUK
1
它的GDB功能http://sourceware.org/gdb/wiki/ReverseDebug被这个https://bugs.eclipse.org/bugs/show_bug.cgi?id=258284请求支持在Eclipse中。我想答案是肯定的,因为自2009年以来一直如此。 - Sergei Krivonos
它在CDT中是可访问的。 - Sergei Krivonos
我是一名Java开发人员,所以我猜CDT对我不会有太大用处? - DeejUK
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Sammy
显示剩余5条评论

5

我有偏见,但是Chronon正好符合您的要求。

回到帧并不完全等同于步进后退,因为如果该方法在堆上更改了任何内容,则不会被还原。


1
Chronon是否允许您实时执行此操作? 我的理解是,您首先需要使用Chronon记录会话,然后可能可以在该会话中回退。这不就像重新启动应用程序一样好吗?或者我可能漏掉了什么... - Raam
2
是的,您确实需要先记录应用程序,然后随时可以从记录中调试它。这与重新启动应用程序不同,因为您不需要经过重现错误的所有步骤。您只需记录一次错误,然后就可以在任何时候查看它,仅使用录制即可进行调试。您不需要任何原始环境的部分来播放记录。 - pdeva
Chronon在docker环境下工作吗?我的Eclipse不在本地。 - Choi

3

我也在Eclipse中寻找这个功能。我知道Visual Studio可以做到这一点。实际上,你可以拖动当前行标记并将其放回代码中的任何位置。我不确定变量的更改是否可以撤消。但即使如此,它仍然非常有用,并节省了大量时间。我已经等待Eclipse很长时间了。


1

这个问题没有指定Eclipse的语言,而且很多答案都假设是Java。

如果使用C++和GCC调试器,Eclipse有一个Run->Move to Line命令可以完成任务,并且类似于Visual Studio Set Next Statement。在这种情况下,Eclipse使用了GDB的功能。

如果使用Java,我不知道有没有一种方法可以在Eclipse或Netbeans中实现它,尽管其他答案已经建议使用插件。Eclipse确实有“drop to frame”命令,它适用于我的版本(Juno SR1)中的Java。如果我在调试模式下修改并保存函数内的代码,则执行行会自动移动到当前函数的顶部,然后我可以从那里继续。虽然不是指定行,但也算是一种解决方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,