如何退回Eclipse调试器?


129

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

Answers:


136

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

Omniscient Debugger是另一个确实很酷的工具,它确实可以让您及时地前进和后退。它通过对类加载到类加载器中进行检测来工作,因此它可以记录代码执行的所有操作。它可以做很酷的事情,例如回答“何时,何地以及为什么为该字段分配其当前值?”。UI非常笨拙,并且在处理大型代码库时可能会很费力,但是在某些情况下,它确实可以节省很多时间。

更新Chronon提供了一种商业产品,它被描述为“ Java DVR”,似乎与ODB做了很多相同的事情。


@Matt McHenry我正在尝试使用ODB1.5;一个独立的Java程序,但我不确定如何使它工作?除了ODB站点之外,您是否还有其他资源来说明使它独立运行并与Eclipse兼容的步骤?
Ayusman

@Ayusman:不,对不起,除了ODB网站上的内容之外,我没有其他要分享的东西。如果它不适用于更新的.class文件格式,我不会感到惊讶。:(
马特·麦克亨利

有趣的答案!
KrishPrabakar

似乎Omnscient Debugger网站已被域名抢注。
托尔比约恩Ravn的安德森

45

除了早先的答案中提到的内容以外,即Eclipse在调试视图中的拖放到框架功能,该功能在堆栈框架中较早地重新启动调试(但不还原全局/静态数据)和Omniscient调试器,这有点原始,而且没有太多不断发展-有一些基于Eclipse的工具可用于在(运行)时间内“返回”:

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

Diver仅记录方法调用,而没有真正记录程序状态(如JIVE)。存储每个方法调用事件,以供以后检索和分析。它主要扩展了Java Run和Debug配置以指定过滤器。跟踪可以在运行时暂停/恢复/过滤。记录后,Diver透视图可以在交互式序列图中显示它。

JIVE和Diver是学术研究发布的开源项目。截至2012年11月,两个项目均处于活动状态。

Chronon是一种商业产品,但它们为学生和开源项目提供免费许可证。从他们网站上声称的内容来看,它可能是最全面的记录器,因为它能够重放记录的历史记录,并来回移动,使他们可以花时间调试。此外,Eclipse不需要进行记录。

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

以我为例,我尝试使用JIVE和Diver调试XML解析程序,但由于缺乏资源,总是以冻食告终。使用这些技巧,Diver 在Linux 64位操作系统上运行可能会比较棘手,它可以在Ubuntu 32位以及其他32位发行版上运行。Diver可在Windows上运行,最好在Windows 64位+ 64位JVM上运行,否则在32位Windows上您将只能使用1.3-1.6Gb最大堆空间。JIVE在我的Linux 64bit上运行良好,在其他平台上似乎运行良好。


潜水员已
停职

12

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

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

比您可以按shift+F5或向前或shift+F6向后退一步。F5F6


1
所有Eclipse版本中都存在此选项吗?如果我在任何地方都能找到它,我会感到很愤怒。
EngineerBetter_DJ

1
它的GDB功能sourceware.org/gdb/wiki/ReverseDebug,此bugs.eclipse.org/bugs/show_bug.cgi?id=258284请求在Eclipse中支持。好吧,我想自2009
Sergei 2013年

在CDT中可以访问它。
谢尔盖

我是Java开发人员,所以我猜CDT对我没有多大用处?
EngineerBetter_DJ

@Sergei我正在Windows 7 SP1下使用旧的Springsource版本进行此操作。要启用反向调试,您必须首先调试-> Debug Configurations-> Main。页面底部是进程启动器。它将显示“正在使用标准创建流程启动器”,并且将有一个指向“选择其他...”的超链接。单击此按钮,并确保选中“使用特定于配置的设置”,然后选择“ GDB(GSF)创建流程启动器”,然后单击确定。现在,将在主选项卡的底部显示“使用GDB(GSF)创建流程启动器”。
萨米2015年

5

我有偏见,但Chronon确实满足您的需求。

Drop to Frame并不会完全退后,因为如果该方法更改了堆中的任何内容,则不会还原。


1
Chronon是否允许您实时执行此操作?我的理解是,您首先需要使用chronon记录会话,然后可以退回到该会话。这与重新启动应用程序一样好吗?或者也许我缺少了一些东西
。– Raam

2
是的,您确实需要先记录您的应用程序,然后可以从记录中随时对其进行调试。它与重新启动应用程序不同,因为您无需执行所有步骤即可重现该错误。您要做的只是记录一次该bug,然后您可以在只想使用记录进行调试的任何时间查看它。您不需要原始环境的任何部分即可播放录音。
pdeva

Chronon是否可以在docker环境中工作?我eclise是不在本地..

3

我也在Eclipse中寻找此功能。我知道视觉工作室可以做到。实际上,您可以将当前行标记拖放到代码中的任何位置。我不太确定是否可以撤消对变量的更改。即便如此,它仍然非常有用,并且可以节省大量时间。我已经等了很长时间了。


1

该问题未指定Eclipse语言,并且许多答案都假定使用Java。

如果将C ++和GCC与GDB调试器一起使用,则Eclipse Run->Move to Line可以完成工作和功能,例如Visual Studio Set Next Statement。在这种情况下,Eclipse使用的是GDB中的功能。

如果使用Java,尽管其他答案都建议使用插件,但我不知道如何使用Eclipse或Netbeans来实现。在我的版本(Juno SR1)中,Eclipse确实具有适用于Java的“ drop to frame”命令。如果在调试模式下修改并保存函数中的代码,执行行将自动移至当前函数的顶部,我可以从那里继续。与指定行不同,但这是必须的。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.