在Java FX应用程序中,调试模式下IDE在断点处挂起

27

我在使用IntelliJ IDEA进行调试时遇到了问题,在javafx应用程序的监听器中的断点处,它在调试模式下挂起。我尝试增加堆空间,但没有帮助。也许有人也遇到了这样的问题,请建议我该怎么做。

2个回答

66

将此设置为VM参数:

-Dsun.awt.disablegrab=true

它会干扰拖放操作,并在调试器暂停时在屏幕上留下痕迹 - 但它将让您进行调试。每当您阻塞JavaFX线程时,它就会发生。


1
谢谢,这个问题让我抓狂了。 - Ilia Choly
2
谢谢!当我尝试调试一个旧应用程序时,我的笔记本电脑(运行Ubuntu 16.04)冻结了(唯一的解决方法是ctrl+alt+f1并运行sudo killall java),但这确实有所帮助 :) - L42
1
你是我的救星。这个问题让我抓狂。谢谢。 - Arash
也适用于Eclipse! - Benjamin Peter
谢谢,这也适用于awt,我的应用程序中没有使用javafx,我将此选项添加为正在运行的配置中的VM选项。Ubuntu 18.10。 - philippe lhardy

1
这可能是因为应用程序锁定了桌面,例如模态对话框、弹出窗口或打开菜单。然后它在断点处停止。这会通知IDE。现在,IDE 尝试在您的桌面上执行某些操作,但无法执行,因为应用程序仍然锁定整个桌面 -> 死锁。
您可以使用像 Chronon 这样的工具记录整个程序,并让您在时间轴上前后移动。
最后一个选项是日志记录或 穷人调试器 (System.out)。 [编辑]

很难使用 System.out 检查 20 个参数中哪个不相等。

实际上这很容易:
System.out.println("check");
if(!a1.equals(b2)) System.out.println(a1+"!="+b1);

接着复制最后一行。这样,只有在实际存在有趣内容时才会输出结果(而不是19个相同的参数)。如果您无法区分aXaY(即两者都为true),请为输出添加一些模式:

if(!a1.equals(b2)) System.out.println("a1:"+a1+"!="+b1);

如果我需要检查具有20个参数的两个对象是否相等,并且它返回false,但我实际上期望的是true,那么很难使用System.out检查哪些20个参数不相等。此外,在调试监听器中,我的同事们都没有这样的问题,但他们也不知道出了什么问题,我们都拥有相同的硬件、操作系统和环境。 - vikki
我喜欢这里的解释,但不喜欢这个解决方案。我正在尝试让我的调试器在Ubuntu上工作,我需要它能够正常工作。在我的OSX机器上,使用相同的IDE和应用程序时,我没有遇到这些问题。我有哪些选择? - craigmiller160
@user2223059,您可以使用接受的答案中的命令行选项,使用日志记录,Chronon或者您可以为Linux创建一个新的无锁桌面。 - Aaron Digulla

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