7

我花了很多时间在 Eclipse 中使用 JPDA 调试应用程序。Eclipse 调试器有一些问题让我很恼火。任何人都可以推荐插件、更好的调试器或我还不知道的技巧吗?

  • 在“变量”选项卡中,您可以输入并执行一些 Java 代码。然而,你首先需要点击一些东西(我通常点击“this”)给它一些上下文。然后,在您输入一个冗长的 Java 表达式来调试并“执行”它之后,您的表达式将被结果替换,因此您需要重新输入它。有没有更好的方法,例如控制台或我缺少的东西?
  • 当您浏览数据结构时,调试器中的表示还有很多不足之处。您会看到 Lists、Maps、StringBuilders 等的内部表示。我想看到的是这些对象在概念上包含什么。有没有办法做到这一点,也许使用其他调试器,或扩展或其他东西?
  • 当抛出异常时,是否有某种方法可以检查抛出异常的应用程序的状态?目前我需要在异常发生之前设置断点,然后尝试重现它。
  • 当我跨过一条上面有许多语句的行时,我实际上无法看到正在执行哪些语句,除非通过“介入”每个语句来查看它会将我带到哪里。
  • 如果没有找到源代码,Eclipse 只会茫然地盯着你。你会得到一个有用的屏幕,上面写着“类文件编辑器/找不到源代码”,这完全没用。我更希望能够逐步浏览字节码,这样我至少可以看到发生了什么。有人知道比 Eclipse 做得更好的 Java 调试器吗?
4

8 回答 8

11

我使用 Eclipse 调试器已经有一段时间了,并分享了您的一些担忧。但是,您提到的一些要点已在 Eclipse 调试器中得到解决/解决:

数据结构:变量视图已经可以选择显示列表/集合/数组等的“逻辑结构”。该视图的左上角有一个按钮可以启用此功能。您还可以通过 Java->Debug->Logical Structures 首选项添加您自己的自定义表示。

异常:调试器允许您设置异常断点(在断点视图中添加 Java 异常断点按钮)。当抛出特定异常时会触发这些断点。

源代码:如果你安装了一个有字节码查看器的插件(例如 asm 字节码插件http://asm.ow2.org/eclipse/index.html),当源代码丢失时,调试器会单步调试字节码.

于 2010-12-22T21:27:09.727 回答
4

我同意 Vilas Jagannath 所说的大部分内容。

使用 Eclipse 调试器 附加点:

1) 显示视图。此视图允许您在当前堆栈帧的上下文中运行代码。这允许您检查任意位的代码。在某些方面它有点原始,但它可以作为便笺簿使用。

4) 如果您想在一行中使用复杂表达式进行某个方法调用,您可以导航到该函数,然后“运行到行”(Ctrl + R)

5)您还可以使用步骤过滤器来过滤您不关心的类。右键单击您不关心的堆栈帧,然后单击“过滤器类型”。确保您启用了“使用步骤过滤器”。它是 Debug 视图中 drop to frame 按钮右侧的带有两个箭头的图标。

于 2010-12-22T21:39:25.080 回答
3

我使用 NetBeans 及其调试器。

关于您的第三点(异常):我认为没有其他方法可以查看抛出异常时的状态。当异常从方法中抛出时,该方法的堆栈帧已被丢弃 - 它丢失了,因此您无法再检查它。

据我所知,NetBeans 调试器也不允许您单步执行字节码。

于 2010-12-22T21:22:05.247 回答
3

这是我的答案 - 项目符号与您的问题项目符号的顺序相同:

  • 有一个更好的方法来做到这一点:
    1. 使用显示视图执行语句。
    2. 在类本身上写一些东西并“检查”它(ctrl+shift+I)
  • 请参阅变量视图中显示“显示逻辑结构”的小图标。这可能是您正在寻找的。
  • 您可以在 Exception 上设置一个通用断点以在异常发生时捕获它 - 在异常视图中 J! 图标。
  • 我使用 ctrl+alt+鼠标左键单击我要进入的方法,就像一个魅力!
  • 您仍然可以使用按键或按钮进行步进(参见堆栈)。如果要查看代码,请使用反编译器。

我相信他们仍然有需要改进的地方,但这些提示可能会对您有所帮助。

于 2010-12-23T04:29:38.023 回答
1

通常情况下,我会说 eclipse 的调试器比我首选的 IDE IntelliJ(免费版)更好。对于前四个,IntelliJ 在异常断点上可能更好(它允许您查看抛出异常时的状态) 、对象类型的自定义渲染器和持久表达式(即,每次更改上下文时都会重新评估表达式)

我不知道有任何调试器会单步执行字节码。

于 2010-12-22T21:23:23.253 回答
1

当我跨过一条上面有许多语句的行时,我实际上无法看到正在执行哪些语句,除非通过“介入”每个语句来查看它会将我带到哪里。

选择您要进入的功能,然后使用“Step Into Selection”(我在 Ctrl-F5 上有它,但您可以在上下文菜单中找到它)。

于 2010-12-27T07:46:32.263 回答
0

作为替代方案,您可以使用 log.debug 和 System.out.println's 乱扔代码,这意味着您可以做任何您想做的事情!

于 2010-12-28T19:11:52.090 回答
0

对于不同于 gui 调试器的东西,我有一个名为jdiscript的项目,它允许您编写 JVM 的 Java 调试器接口的脚本。我发现它对于解决线程争用问题和查找似乎只是在生产负载下偶尔出现的问题特别有用。

于 2014-04-13T18:43:38.973 回答