【发布时间】:2011-05-18 21:30:21
【问题描述】:
是否可以在 Eclipse 调试器中进行反向执行?我正在处理的当前项目至少需要 5 秒来读取和初始化文件中的数据,然后才能完成任何操作。如果我在调试器中越界,我必须终止程序并重新启动,这需要相当长的时间。
【问题讨论】:
是否可以在 Eclipse 调试器中进行反向执行?我正在处理的当前项目至少需要 5 秒来读取和初始化文件中的数据,然后才能完成任何操作。如果我在调试器中越界,我必须终止程序并重新启动,这需要相当长的时间。
【问题讨论】:
您可以使用 Eclipse 的drop to frame 命令从顶部重新输入当前方法。但它不会展开已发生的任何状态更改,因此它可能无法正常工作,具体取决于您使用的方法类型。
另一个非常酷的工具是Omniscient Debugger。它通过在类加载器中加载类时检测类来工作,因此它可以记录您的代码所做的一切。它可以做一些很酷的事情,比如回答“何时、何地以及为什么这个字段被分配了它的当前值?”。 UI 相当笨重,处理大型代码库可能会很困难,但在某些情况下确实可以节省大量时间。
更新:Chronon 提供了一种商业产品,它被描述为“Java 的 DVR”,它似乎做很多与 ODB 相同的事情。
【讨论】:
除了之前的答案中提到的 - 即 Eclipse 在 debug view 中的 drop to frame 功能,它在堆栈帧中重新开始调试(但不会恢复全局/静态数据)和 Omniscient debugger,这有点原始的,并没有太多的发展 - 有一些基于 Eclipse 的工具可用于在(运行)时“返回”:
JIVE 扩展了 Eclipse Java 调试器,能够记录程序状态。 JIVE 透视图提供了一些有用的 UML 图,这些图会在程序运行时更新。这些图提供了应用程序(对象图)和堆栈跟踪(序列图)状态的概述。您可以查询记忆的轨迹并及时退步和前进,并查看相应的图表。
Diver 只记录方法调用,并不像 JIVE 那样真正记录程序状态。存储每个方法调用事件以供以后检索和分析。它主要扩展 Java 运行和调试配置以指定过滤器。跟踪可以在运行时暂停/恢复/过滤。记录后,Diver 透视图可以将其显示在交互式序列图中。
JIVE 和 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 位和可能使用 these tips 的其他 32 位发行版。 Diver 在 Windows 上工作,更好的是在 Windows 64 位 + 64 位 JVM 上,否则你将被限制为 maximum heap space of 1.3-1.6Gb on 32bit windows。 JIVE 在我的 64 位 linux 上运行良好,在其他平台上似乎也运行良好。
【讨论】:
是的,Eclipse CDT 支持历史调试器功能。
打开调试配置 -> 调试器 -> 启用反向调试
启动时 .
您可以按shift+F5 或shift+F6 后退,如F5 或F6 前进。
【讨论】:
我有偏见,但 Chronon 完全符合您的要求。
Drop to Frame 并不是完全退后一步,因为如果该方法更改了堆上的任何内容,它将不会被还原。
【讨论】:
我也在 eclipse 中寻找这个功能。我知道视觉工作室可以做到这一点。实际上,您可以将当前行标记拖放到代码中的任何位置。我不太确定是否可以撤消对变量的更改。但即便如此,它仍然非常有用,可以节省大量时间。我已经在 Eclipse 中等待了很长时间。
【讨论】:
该问题没有指定 Eclipse 语言,并且许多答案都假定使用 Java。
如果在 GDB 调试器中使用 C++ 和 GCC,Eclipse 有 Run->Move to Line,它可以像 Visual Studio Set Next Statement 一样完成工作和功能。在这种情况下,Eclipse 正在使用 GDB 中的功能。
如果使用 Java,我不知道使用 Eclipse 或 Netbeans 的方法,尽管其他答案有建议的插件。在我的版本(Juno SR1)中,Eclipse 确实有适用于 Java 的“drop to frame”命令。如果我在调试模式下修改并保存函数中的代码,执行行会自动移动到当前函数的顶部,我可以从那里继续。和指定行不一样,但确实是这样。
【讨论】: