您使用哪个Java调试器

时间:2010-12-22 21:16:59

标签: java eclipse debugging jpda

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

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

8 个答案:

答案 0 :(得分:11)

我一直在使用Eclipse调试器一段时间并分享您的一些顾虑。但是,您提到的一些要点已在Eclipse调试器中解决/解决:

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

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

源代码:如果您安装了一个包含字节码查看器的插件(例如asm字节代码插件http://asm.ow2.org/eclipse/index.html),调试器将在缺少源代码时逐步执行字节码。

答案 1 :(得分:4)

我同意Vilas Jagannath所说的很多内容。

使用Eclipse调试器 补充要点:

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

4)如果你想在具有复杂表达式的行中调用某个方法,可以导航到该函数,然后“Run to Line”(Ctrl + R)

5)您还可以使用步骤过滤器来过滤您不关心的类。右键单击您不关心的堆栈框架,然后点击“过滤器类型”。确保您有“使用步骤过滤器”。它是调试视图上“逐帧”按钮右侧两个箭头的图标。

答案 2 :(得分:3)

我使用NetBeans及其调试器。

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

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

答案 3 :(得分:1)

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

我不知道任何将逐步执行字节代码的调试器。

答案 4 :(得分:1)

以下是我的答案 - 子弹与你的问题项目符号的顺序相同:

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

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

答案 5 :(得分:1)

  

当我踩到一条线时   关于它的许多陈述,我不能   实际上看看哪些陈述   正在执行,除了“踩踏”   在“每个人看到它需要的地方   我

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

答案 6 :(得分:0)

作为替代方案,您可以使用log.debug和System.out.println来丢弃代码,这意味着您可以随心所欲地执行任何操作!

答案 7 :(得分:0)

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