在 Eclipse 中调试 Java 时移动指令指针
Posted
技术标签:
【中文标题】在 Eclipse 中调试 Java 时移动指令指针【英文标题】:Moving the instruction pointer while debugging Java in Eclipse 【发布时间】:2010-12-11 16:54:01 【问题描述】:在 Eclipse (Galileo) 中调试 Java 程序时,我可以将指令指针直接移动到我选择的行(在当前方法中)吗?
在 Visual Studio 的方法中将指令指针拖到所需的行很简单,但我在 Eclipse 中看不到执行此操作的方法(并且在文档或谷歌上找不到任何相关内容) .
【问题讨论】:
听起来是一件非常糟糕的事情。你为什么需要它?而在 VS 中,您可以使用 C# 还是仅使用 C++? @Pilgrim:为什么这是一件坏事?这是一个很好的调试工具。与必须使用一组新输入重新启动执行以运行其他分支相比,您可以探索方法中各个分支的行为,并在一次调试过程中完成更多工作。结合编辑代码和继续调试(使用重新编译的代码)的能力,它使得在调试的同时进行修复非常有效。不懂C++,没做过那个平台的C++开发。 我也想跳过一些陈述。不回溯什么的。这应该是调试器/IDE 的基本功能。 我惊呆了,难以置信,这似乎是真的。 @DenisTulskiy 坏事?你在开玩笑吗?我们是开发人员,我们知道自己在做什么。我只想尝试代码执行的某些变体,而无需多次重新编译。在 Visual Studio 中,您只需拖放指针即可。当然,你不能把它放到任何地方,范围很重要,变量等等。当我说这是我期望从 IDE 获得的基本功能时,我并不是说它很容易实现。这一点也不坏,因为我们知道自己在做什么。它会提高你的工作效率(考虑无缘无故地重新编译几次而不是拖放)。 【参考方案1】:这是可能的...
http://help.eclipse.org/galileo/index.jsp?topic=/org.eclipse.jdt.doc.user/tips/jdt_tips.html
Drop to frame - 单步执行代码时,您可能偶尔会走得太远,或者越过您想要跨入的行。 无需重新启动调试会话,您可以使用 Drop 来 框架动作快速回到方法的开头。选择 与您希望重新启动的 Java 方法对应的堆栈帧, 并从调试视图工具栏或堆栈帧的 上下文菜单。当前指令指针将被重置为 方法中的第一个可执行语句。这适用于非顶部堆栈 框架也是如此。
请注意,Drop to frame 仅在使用 1.4 或 更高的 VM 或 J9 VM。在某些情况下,JVM 可能 无法从堆栈中弹出所需的帧。例如,它是 通常不可能下降到堆栈的底部框架或 本机方法下方的任何框架。
【讨论】:
正如 Eric J. 在另一条评论中所说,此功能允许您返回方法的开头并重新执行它,但不允许您将指令指针移动到给定行,除非执行从那里通过。 在 Eclipse Luna 中,这仍然无法完成 - 除了 Drop to Frame - 部分完成。 (这在其他 VS for C/C++/C# 中肯定会节省时间)。这是一个已解决的关于 Eclipse 的错误报告,似乎早在 2008 年就已经实现了它,所以这可能是 jvm 的一个限制:bugs.eclipse.org/bugs/show_bug.cgi?id=118147 Pl 在此线程上发布更新,只要它可用。 这真的很高兴知道,但不是我在发布问题时想要达到的目标。 看起来你不能比调用堆栈上的下一个原生帧更远。 @JohanGunnarsson:该错误似乎仅适用于 CDT (C++),不适用于 Java【参考方案2】:这是不可能的。
如果您只是想在当前位置执行一些代码,您可以使用Expressions
视图并将您的代码作为表达式输入。表达式求值调用的方法将在当前调试上下文中运行。
【讨论】:
他正在寻找的唯一“某种”东西是步骤过滤help.eclipse.org/help32/index.jsp?topic=/… 看起来有足够的共识(基于赞成票)这是不可能的。感谢您的信息。 有点遗憾,我们在 1980 年代初就拥有在调试器中执行此操作的技术,但现在无法做到... 另外,如果您不知道,您可以修改变量以强制执行各种代码路径。在“表达式”中,您可以输入“x=23”等。例如,将对象设置为 null 可能会锻炼您的 catch 块。 这实际上是 Eclipse 的“即时窗口”版本【参考方案3】:无法像在 Visual Studio 中那样移动指针,但解决方法是:
回到当前执行方法的开头: 从调试调用栈中选择方法,右键->“Drop to frame” 瞧,你又回到了方法的开头。
现在要到达您想要的行,请单击该行并按 ctrl+r 或右键单击该行并选择“运行到行”。
这些技术非常有用,可以大大减少调试工作,享受吧!
【讨论】:
【参考方案4】:我使用的一个技巧是在您的班级中输入一个空格,在安全的地方,例如在注释行中;立即将其删除并保存课程。这会强制执行点跳转到当前方法的开头。我承认,这并不理想,但它有时可以用作实现您想要的解决方法。
虽然在 eclipse 的默认安装中不可能像在 Visual Studio 中那样直接移动执行点,但可能存在一个 eclipse 插件在某处提供该功能。到处搜索一下。
【讨论】:
【参考方案5】:我最喜欢 ankon 的回答,但另一种选择(仅适用于您的特定实例 - 如果那样的话)是在您的 if
上的断点处停止并修改在条件中评估的变量,使得它返回 false(从“变量”视图中,右键单击变量并单击“更改值...”)
【讨论】:
感谢您的建议。一般来说,这将是一种解决方法。在这种情况下,if 语句会评估函数调用的结果,因此我必须介入并更改返回值。【参考方案6】:我认为这在旧版本的 eclipse 中是完全可能的,我认为我有这样做的记忆,但我想我只是在 Visual Studio 中工作时植入了那个记忆。从我正在阅读的内容来看,它可能来自 jvm 而不是 eclipse 本身,有些页面建议 jvm 无法处理。
在我看来,Eclipse 比 VS 好很多倍,我在这两个方面都进行了广泛的工作,自从我发现 Eclipse 后,当我不得不在 VS 中工作时,我总是很痛苦。但是现在没有这个功能肯定很痛苦嘿嘿。
【讨论】:
【参考方案7】:您可以直接跳转到当前调试方法内的任何其他方法调用。选择当前指令指针下方的某个方法调用,然后从上下文菜单中使用“Step into selection”。
【讨论】:
【参考方案8】:不幸的是,无法使用指令指针(程序计数器)向前推进,因此您需要做的是引入您自己的“调试”变量,您可以对其进行测试 - 假设您想要绕过一个需要执行的循环太长,然后添加一个变量并测试其增加的值,然后将循环封装在带有该变量的 if 中。我知道这很难看,但它可以完成 - 或者你可以用 C++ 开发 :-)
【讨论】:
【参考方案9】:只需右键单击所需的行并选择运行到行。就是这样...
【讨论】:
不是在 2009 年我问这个问题时 :-) 我不再使用 Eclipse,所以我无法确认这是否有效。 如果你点击“运行到行”,它不会移动你的指令指针。当所选行命中时,它将恢复执行和断裂。这将不允许您返回或跳入有条件的块。 这似乎只在向前跑时有效,在试图向后跑时无效。 并且不会跳过当前指针位置和目标行之间的代码行,这正是 Visual Studio 中此功能最常见的用途。 Ctrl+R(运行到行)和右键单击堆栈中的方法的组合 -> 拖放到帧非常有用,并且大大减少了调试工作!【参考方案10】:将光标放在您选择的行上,然后按 ctrl-R(“运行到行”)或右键单击并从上下文菜单中选择“运行到行”。
【讨论】:
这不会将指令指针移动到我选择的行,它会在该行设置一个临时断点,然后再次开始运行。它将执行中间指令,并且它永远不会到达我选择的行,除非自然程序流无论如何都指向那里。换句话说,它不允许我将指令指针设置在否则无法到达的分支中。以上是关于在 Eclipse 中调试 Java 时移动指令指针的主要内容,如果未能解决你的问题,请参考以下文章
Eclipse 在调试时使用 java 8 在 ClassLoader 上中断