【问题标题】:How to step back in Eclipse debugger?如何退回 Eclipse 调试器?
【发布时间】:2011-05-18 21:30:21
【问题描述】:

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

【问题讨论】:

    标签: eclipse debugging


    【解决方案1】:

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

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

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

    【讨论】:

    • @Matt McHenry 我正在尝试使用 ODB1.5;有一个独立的 java 程序,但我不知道如何让它工作?除了 ODB 站点之外,您还有其他资源来解释使其独立工作并与 Eclipse 一起工作的步骤吗?
    • @Ayusman:不,很抱歉,除了 ODB 网站上的内容之外,我没有任何可分享的内容。如果它不适用于更新的 .class 文件格式等,我不会感到惊讶。 :(
    • 出现 Omnscient Debugger 网站已被域名抢注。
    【解决方案2】:

    除了之前的答案中提到的 - 即 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 上运行良好,在其他平台上似乎也运行良好。

    【讨论】:

    • Diver 已停产
    【解决方案3】:

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

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

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

    【讨论】:

    • 这个选项是否存在于所有版本的 Eclipse 中?如果我能在任何地方找到它,我就危险了。
    • 它的 GDB 特性 sourceware.org/gdb/wiki/ReverseDebug 在 Eclipse 中由这个 bugs.eclipse.org/bugs/show_bug.cgi?id=258284 请求支持。好吧,我想自 2009 年以来答案是肯定的。
    • CDT可以访问。
    • 我是一名 Java 开发人员,所以我猜 CDT 对我用处不大?
    • @Sergei 我在 WIndows 7 SP1 下使用旧的 Springsource 版本执行此操作。要启用反向调试,您必须首先调试 as->Debug Configurations->Main。页面底部是进程启动器。它将显示“使用标准创建流程启动器”,并且将有一个指向“选择其他...”的超链接。单击它并确保选中“使用配置特定设置”,然后选择“GDB (GSF) Create Process Launcher”并单击确定。 “使用 GDB (GSF) 创建进程启动器”现在将显示在主选项卡的底部。
    【解决方案4】:

    我有偏见,但 Chronon 完全符合您的要求。

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

    【讨论】:

    • Chronon 是否允许您实时执行此操作?我的理解是,您首先需要使用 chronon 录制会话,然后您可以退回到该会话。这不是和重新启动应用程序一样好吗?或者也许我错过了什么..
    • 是的,您确实需要先录制您的应用程序,然后可以在录制后随时对其进行调试。它与重新启动应用程序不同,因为您不需要执行所有步骤来重现错误。您所做的只是记录一次错误,然后您可以在任何时候仅使用记录进行调试即可查看它。您不需要原始环境的任何部分来播放录音。
    • Chronon 是否在 docker 环境中工作?我的 ecrise 不在本地..
    【解决方案5】:

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

    【讨论】:

      【解决方案6】:

      该问题没有指定 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”命令。如果我在调试模式下修改并保存函数中的代码,执行行会自动移动到当前函数的顶部,我可以从那里继续。和指定行不一样,但确实是这样。

      【讨论】:

        猜你喜欢
        • 2017-09-22
        • 2014-05-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-01-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多