2008-12-18 58 views
2

我想調試一個用戶點擊按鈕和用戶界面剛剛死亡的問題。我知道,祝你好運。Java swing用戶界面崩潰調試

日誌只是在用戶點擊按鈕後結束,所以我想可能會有一些異常/錯誤,我們沒有記錄。也許是OutOfMemoryError。

關於如何進行的任何建議?獲取更多信息。 Java命令設置等

感謝所有幫助

  • 豐富

回答

4

的Java和什麼樣版機?

在任何情況下,這裏是獨家新聞:事件隊列線程與主線程有點分開。在Java <中,有一個錯誤使得從該線程捕獲事件變得困難,所以有些例外就消失了。在Java 5中,有一個新方法Thread.setDefaultUncaughtExceptionHandler(),它可以讓你爲任何可能未被捕獲的東西設置一個異常處理程序。在那裏添加一個處理程序,並捕獲所有Throwables並記錄它們。

這也是一個很好的黑客處理的事情,否則你可能會調用System.exit(),以及;有一個normalExitThrowable;扔在那個你要在GUI中調用exit的地方,並確保所有的東西都被清理乾淨。

+0

查理:我覺得自己是漂亮的Java學者的,這是一個新功能這是我絕對不知道的語言。感謝分享! – 2008-12-18 19:03:27

0

嘗試重定向標準輸出 - 你可能會看到異常堆棧跟蹤在那裏。

0

您必須有一個事件偵聽器來等待鼠標點擊事件。你是否通過該代碼追蹤到特定的行?

該代碼必須至少到達第一行,我看不到事件偵聽器不工作。

你需要把它分解一點。

,如果它是隻得到了一條線,那麼你需要深入到代碼,直到你有一個以上的線路,或直到您可以隔離它多一些......

0

我不知道你的意思是「剛死」。

  • 如果將UI拖到屏幕邊緣之外並重新插入,用戶界面是否仍然會重繪?
  • 整個過程是否最終意外終止?
  • 整個過程立即意外終止嗎?

假設UI是當你點擊一個按鈕仍然存在,並沒有什麼似乎發生,另一種簡單的方法來診斷什麼可能會錯誤是來監視進程的CPU和內存使用情況。任務管理器(或更好的,Process Explorer),如果你在Windows中; ps如果你有一些Unix的味道(也可能是Mac)。檢查該進程首先使用多少CPU。

如果它是0%,那麼你可能有一些良性的東西,比如沒有聽衆的按鈕(因此點擊它沒有任何影響)。

如果它是100%,那麼你可能有一些商業邏輯運行得像瘋了一樣,可能是無限循環。需要注意的兩件事:一,檢查內存使用情況,看看它是否正在上升;一個錯誤可能會導致大量的對象被創建,並且最終會導致內存不足。不知道代碼是做什麼的,肯定無法說出來。第二件事是上面提到的:將UI拖出屏幕然後再回來。 Java的EDT(事件調度線程)負責處理所有UI事件,包括重新繪製UI時可見的UI;如果它不這樣做,那麼你知道美國東部時間有些東西不應該這樣做,從而避免重蹈覆轍。據我所知,商業邏輯運行良好,但僅僅需要一段時間,而且正在佔領美國東部時間。

(如果它只是在50%,33%,25%,等等,那麼你是一個多CPU的機器上,看到100%以上......)

從你的描述,但是(即「日誌剛剛結束」),這聽起來像您的用戶界面或業務邏輯正在等待永遠不會到來的事情,所以您將在該進程中擁有0%的CPU。無論如何值得檢查,因爲它很快並且可以在錯誤的地方阻止不必要的錯誤追蹤。

0

該應用程序在java 1.6上運行。整個過程立即意外終止。

另一個信息是,使用webstart啓動swing應用程序。

我正在查看代碼,基於日誌的最後一行,看看我能否弄清楚發生了什麼。

不幸的是,這發生過之前和每一次在不同的點,所以我一直無法重現。

我們最終可能會最終使用Thread.setDefaultUncaughtExceptionHandler()建議,並查看是否可以獲取更多信息。

更多的想法是值得歡迎的。非常感謝您的幫助

0

我能夠找到jvm錯誤文件。
看起來像是在「AWT-Windows」原生線程中發生的事情。

=> 0x02acf000 JavaThread 「AWT-Windows的」 守護程序[_thread_in_native,ID = 3616,堆疊(0x02eb0000,0x02f00000)]

SIGINFO:ExceptionCode = 0000005,寫地址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代碼)
Ĵsun.awt.windows.WToolkit.eventLoop()V + 0
Ĵsun.awt.windows.WToolkit。 run()的v + 69
Ĵjava.lang.Thread.run()v + 11
v〜StubRoutines :: call_stub