你使用哪个Java调试器?

7

我花费大量时间使用JPDA在Eclipse中调试应用程序。但是Eclipse调试器有一些问题真的很让我烦恼。是否有人可以推荐插件、更好的调试器或者我还不知道的技巧?

  • 在“变量”选项卡中,您可以键入并执行Java代码片段。但是,在执行前,您需要先单击某个东西(通常是单击“this”)以提供上下文。然后,在您键入用于调试某些内容的较长Java表达式并“执行”它之后,您的表达式会被替换为结果,因此您需要重新输入。是否有更好的方法,例如控制台或其他我不知道的方式?
  • 当您浏览数据结构时,调试器中的显示方式令人不满意。您只能看到List、Map、StringBuilder等的内部表示形式。我想看到这些对象概念上包含的内容。是否有一种方法可以做到这一点,例如使用其他调试器、扩展或其他方法?
  • 当抛出异常时,是否有一种方法可以检查抛出异常时应用程序的状态?目前,我需要在异常发生之前设置断点,然后尝试复现它。
  • 当我跨越具有多条语句的行时,除非“步入”到每个语句中查看其执行情况,否则我无法看到正在执行哪些语句。
  • 如果找不到源代码,Eclipse只会盯着您。您会得到一个有用的屏幕,显示“Class File Editor / Source code not found”,这完全没有用。我更喜欢能够跨越字节码,这样我至少可以看到发生了什么。是否有人知道比Eclipse更好的Java调试器?

2
可能是推荐一个(独立的)Java调试器的重复问题。 - Greg Hewgill
8个回答

11

我已经使用Eclipse调试器有一段时间了,并分享你的一些担忧。然而,你提到的一些问题已经在Eclipse调试器中得到解决/处理:

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

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

源代码:如果安装一个插件(例如asm字节码插件http://asm.ow2.org/eclipse/index.html),该插件具有字节码查看器,则当源代码缺失时,调试器将跟踪字节码。


4

我同意Vilas Jagannath的很多观点。

使用Eclipse调试器 附加要点:

1)Display视图。该视图允许您在当前堆栈帧的上下文中运行代码。这使您可以检查任意代码片段。在某些方面,它有点原始,但作为草稿板非常好用。

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

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


3

我使用NetBeans和它的调试器。

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

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


3

以下是我的回答 - 项目符号的顺序与您的问题相同:

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

我认为它们仍有改进的空间,但这些提示可能会对您有所帮助。


1
通常情况下,我会说 Eclipse 拥有比我偏爱的 IDE IntelliJ(免费版)更好的调试器。对于前四个方面,IntelliJ 在异常断点(允许您在抛出异常时查看状态)、对象类型的自定义渲染器和持久表达式(即每次更改上下文时重新评估表达式)方面可能更好。
我不知道有任何调试器可以逐步执行字节码。

IntelliJ在异常断点上可能更好(允许您在抛出异常时查看状态),Eclipse也可以做到。 - pstanton

1
当我跨越一行有许多语句的代码时,除非“步入”每个语句以查看执行情况,否则我无法实际看到哪些语句正在执行。
选择您想要进入的函数,并使用“步入所选项”(我将其设置为Ctrl-F5,但您可以在上下文菜单中找到它)。

0
作为替代方案,您可以在代码中添加log.debug和System.out.println的语句,这意味着您可以随心所欲地进行操作!

0

除了GUI调试器之外,我有一个名为jdiscript的项目,它允许您编写JVM的Java调试接口脚本。我发现它在解决线程争用和查找仅在生产负载下偶尔出现的问题方面特别有用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接