繁体   English   中英

如何退回 Eclipse 调试器?

[英]How to step back in Eclipse debugger?

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

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

另一个非常酷的工具是Omniscient Debugger 它通过在类加载器中加载类时对其进行检测来工作,因此它可以记录您的代码所做的一切。 它可以做很酷的事情,比如回答“这个字段在何时、何地以及为什么被分配其当前值?”。 UI 相当笨重,处理大型代码库可能会很困难,但在某些情况下,它确实可以节省大量时间。

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

除了前面的答案中提到的内容之外 - 即 Eclipse 在调试视图中的 drop to frame 功能,它在堆栈帧中更早地重新启动调试(但不恢复全局/静态数据)和Omniscient debugger ,这有点原始而不是那么多不断发展 - 有一些基于 Eclipse 的工具可用于在(运行)时“返回”:

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

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

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

Chronon 是一种商业产品,但他们为学生和开源项目提供免费许可证。 从他们网站上声称的内容来看,它可能是最全面的记录器,因为它能够重放记录的历史,来回走动,正如他们所说的那样进行时间旅行调试。 录制也不需要 Eclipse。

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

就我而言,我曾尝试使用 JIVE 和 Diver 来调试 XML 解析程序,但由于缺乏资源,最终总是冻结 eclipse。 Diver 在 64 位 linux 上运行可能很棘手,它可以使用这些技巧在 ubuntu 32 位和可能的其他 32 位发行版上运行。 Diver 在 Windows 上工作,在 Windows 64bit + 64bit JVM 上更好,否则你将被限制在 32bit windows 上最大堆空间为 1.3-1.6Gb JIVE 在我的 64 位 linux 上运行良好,在其他平台上似乎也运行良好。

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

打开Debug Configuration -> Debugger -> Enable Reverse Debugging at startup

比您可以按shift+F5shift+F6后退,如F5F6前进。

我有偏见,但Chronon正是您正在寻找的。

Drop to Frame 并不是完全退步,因为如果该方法更改了堆上的任何内容,它就不会被还原。

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM