Java swing UI崩溃调试

我正在尝试调试用户单击按钮并且UI刚刚死亡的问题。 祝你好运。

用户单击按钮后日志才会结束,所以我认为可能存在一些我们没有记录的exception/错误。 也许是OutOfMemoryError。

有关如何进行的任何建议? 获取更多信息。 Java命令设置等

谢谢你的帮助

  • 丰富

哪个版本的java和什么机器?

在任何情况下,这里都是独家新闻:事件队列线程与主线程分开运行。 在Java <5中,有一个错误使得很难从该线程捕获事件,因此一些例外情况就消失了。 在Java 5中,有一个新方法Thread.setDefaultUncaughtExceptionHandler() ,它允许你为任何可能未被捕获的东西设置exception处理程序。 在那里添加一个处理程序,并捕获所有Throwables并记录它们。

对于处理你可能以其他方式调用System.exit()东西来说,这也是一个很好的黑客攻击; 有一个normalExit Throwable ; 抛出你在GUI中调用exit的任何地方,并确保清除所有内容。

尝试重定向标准输出 – 您可能会在那里看到exception堆栈跟踪。

您必须有一个事件侦听器等待鼠标单击事件。 您是否将该代码追溯到特定行?

代码必须至少到达第一行,我看不到事件监听器不工作。

你需要稍微分解一下。

如果它只有一行,那么你需要深入研究该代码,直到你有多行,或者直到你可以将它隔离一些……

我不知道你的意思是“死了”。

  • 如果您将UI拖到屏幕边缘然后再返回,UI是否仍会重绘自身?
  • 整个过程最终会意外终止吗?
  • 整个过程是否会立即意外终止?

假设当您单击按钮时UI仍然存在,并且似乎没有发生任何事情,另一种诊断可能出错的方法是监视该进程的CPU和内存使用情况。 任务管理器(或更好的,Process Explorer),如果你在Windows中; ps如果你有一些Unix的风格(也可能是Mac)。 检查该进程首先使用的CPU数量。

如果它是0%,那么你可能有一些良性的东西,比如没有听众的按钮(因此点击它没有任何效果)。

如果它是100%,那么你可能有一些疯狂运行的业务逻辑,可能是无限循环。 要看两件事:一,检查内存使用情况,看看它是否在上升; 一个错误可能导致创建大量对象,并且最终会耗尽内存。 如果不知道代码的作用,就不可能肯定地说。 第二件事是上面提到的:在屏幕外拖动UI然后再返回。 Java的EDT(事件调度线程)负责处理所有UI事件,包括在UI可见时重新绘制UI; 如果它不这样做,那么你就知道EDT中有一些不应该运行的东西,让它不再像重绘这样做。 据我所知,业务逻辑工作正常,但只需要一段时间,并且正在占用EDT。

(如果它刚好低于50%,33%,25%等,那么你就是在一台多CPU机器上;看到100%以上……)

然而,根据您的描述(即“日志刚刚结束”),听起来您的UI或业务逻辑正在等待永远不会发生的事情,因此您将在该过程中拥有0%的CPU。 无论如何都值得检查,因为它很快并且可以在错误的地方阻止不必要的虫子捕获。

应用程序在java 1.6上运行。 并且整个过程意外地立即终止。

另一条信息是swing应用程序是使用webstart启动的。

我正在查看基于日志中最后一行的代码,看看我是否可以弄清楚发生了什么。

不幸的是,这发生在之前,每次都发生在不同的地方,所以我无法重现。

我们最终可能会最终使用Thread.setDefaultUncaughtExceptionHandler()建议,看看我们是否可以获得更多信息。

更多的想法是受欢迎的。 非常感谢你的帮助

我能够找到jvm错误文件。
看起来在“AWT-Windows”本机线程中发生了一些事情。

=> 0x02acf000 JavaThread“AWT-Windows”守护进程[_thread_in_native,id = 3616,stack(0x02eb0000,0x02f00000)]

siginfo:ExceptionCode = 0xc0000005,写入地址0xe2789280

寄存器:EAX = 0x234f099c,EBX = 0x00001400,ECX = 0x00000100,EDX = 0xe2789280 ESP = 0x02eff4a4,EBP = 0x00000400,ESI = 0x234f099c,EDI = 0xe2789280 EIP = 0x6d02bcbd,EFLAGS = 0x00010206

堆栈顶部:(sp = 0x02eff4a4)0x02eff4a4:02eff500 00000100 02eff584 00000100
0x02eff4b4:6d0a5697 00000400 00000400 00000100
0x02eff4c4:00000100 02eff700 02eff500 00000000
0x02eff4d4:00000000 00000100 041ac3a0 00000100
0x02eff4e4:00182620 00000400 e2789280 00000000
0x02eff4f4:00000000 00000100 00000100 00000000
0x02eff504:00000000 00000100 00000100 00000000
0x02eff514:00000000 00000004 00000400 00000000

说明:(pc = 0x6d02bcbd)
0x6d02bcad:00 00 00 8b 4c 24 14 8b e9 c1 e9 02 8b f0 8b fa
0x6d02bcbd:f3 a5 8b cd 83 e1 03 f3 a4 8b 74 24 18 8b 4c 24

堆栈:[0x02eb0000,0x02f00000],sp = 0x02eff4a4,可用空间= 317k
本机帧:(J =已编译的Java代码,j =已解释,Vv = VM代码,C =本机代码)
C [awt.dll + 0x2bcbd]

[错误报告期间发生错误(打印本机堆栈),id 0xc0000005]

Java框架:(J =编译的Java代码,j =解释,Vv = VM代码)
j sun.awt.windows.WToolkit.eventLoop()V + 0
j sun.awt.windows.WToolkit.run()V + 69
j java.lang.Thread.run()V + 11
v~StubRoutines :: call_stub