是否可以在Eclipse调试器中执行反向执行?我正在处理的当前项目需要至少5秒钟才能完成任何操作之前从文件中读取和初始化数据。如果我在调试器中超越,我必须终止程序并重新启动,这需要相当长的时间。
答案 0 :(得分:130)
您可以使用Eclipse的drop to frame命令从顶部重新输入当前方法。但它不会展开已发生的任何状态变化,因此根据您所使用的方法,它可能无效。
另一个非常酷的工具实际上可以帮助你及时前进,Omniscient Debugger。它通过在类加载器中加载类来进行工作,因此它可以记录代码所执行的所有操作。它可以做很酷的事情,例如回答“何时,何地以及为什么这个字段被赋予其当前值?”。用户界面相当笨重,处理大型代码库时很难,但在某些情况下,它可以节省大量时间。
更新:Chronon提供了一个商业产品,它描述为“DVR for Java”,它似乎与ODB做了很多相同的事情。
答案 1 :(得分:44)
除了之前的答案中提到的内容之外 - 即debug view中Eclipse的逐帧功能,它在堆栈帧中重新开始调试(但不会还原全局/静态数据)和Omniscient debugger,这有点原始而且没有那么多变化 - 有一些基于Eclipse的工具可以用来“回溯”(运行)时间:
JIVE扩展了Eclipse Java调试器,能够记录程序状态。 JIVE透视图提供了一些在程序运行时更新的有用UML图。这些图提供了应用程序状态(对象图)和堆栈跟踪(序列图)的概述。您可以查询记忆的跟踪并及时前进和后退,并查看相应的图表。
Diver只记录方法调用,并不真正记录JIVE等程序状态。存储每个方法调用事件以供以后检索和分析。它扩展了Java Run和Debug配置,主要用于指定过滤器。可以在运行时暂停/恢复/过滤跟踪。一旦记录,Diver透视图就可以在交互式序列图中显示它。
JIVE and Diver是学术研究发布的开源项目。截至2012年11月,两个项目都处于活跃状态。
Chronon是一种商业产品,但他们拥有免费的学生和开源项目许可证。根据他们网站上声称的内容,它可能是最全面的录像机,因为它能够重放录制的历史记录,来回走动,允许他们说时间旅行调试。录制也不需要Eclipse。
所有这些插件都非常贪婪,所以最好有一台好的规格机器并使用它们的过滤器功能。成功运行它们的明确要求是extend the heap space in eclipse.ini。
在我的情况下,我尝试使用JIVE和Diver调试XML解析程序,但由于缺乏资源,总是最终冻结eclipse。 Diver可能是tricky to run on linux 64bit,它适用于ubuntu 32位,可能还有其他32位发行版使用these tips。 Diver适用于Windows,最好是在Windows 64bit + 64bit JVM上运行,否则您将被限制为maximum heap space of 1.3-1.6Gb on 32bit windows。 JIVE在我的linux 64bit上运行良好,似乎在其他平台上运行良好。
答案 2 :(得分:12)
是,Eclipse CDT支持历史调试器功能。
打开调试配置 - > 调试器 - > 启用反向调试
在启动时。
您可以按shift+F5
或shift+F6
退回,例如F5
或F6
,以便前进。
答案 3 :(得分:5)
我有偏见,但Chronon完全符合您的要求。
Drop to Frame并没有完全退回,因为如果方法已经改变了堆上的任何东西,它就不会被还原。
答案 4 :(得分:3)
我也在eclipse中寻找这个功能。我知道视觉工作室可以做到这一点。实际上,您可以拖动当前行标记并在代码中的任何位置删除。我不确定是否可以撤消对变量的更改。但它仍然非常有用,节省了大量时间。我已经在日食中等待了很长时间。
答案 5 :(得分:1)
这个问题没有指定Eclipse语言,许多答案都假定为Java。
如果将C ++和GCC与GDB调试器一起使用,则Eclipse具有Run->Move to Line
,其功能和功能类似于Visual Studio Set Next Statement。在这种情况下,Eclipse正在使用GDB中的功能。
如果使用Java,我并不知道使用Eclipse或Netbeans的方法,尽管其他答案已经建议使用插件。 Eclipse确实有#34; drop to frame"在我的版本(Juno SR1)中适用于Java的命令。如果我在调试模式下修改并保存函数内的代码,执行行将自动移动到当前函数的顶部,我可以从那里继续。与指定行不同,但它是一些东西。