2011-04-18 44 views
4

我們正在經歷一個錯誤,我們無法追蹤哪裏有東西正在凍結我們的擺動線程(現在已經差不多2周了,而且沒有真正的結果) - 我們有經驗的Swing程序員,但我們有一個巨大的程序,並認爲它是在一些遺留代碼如何查看在事件線程上運行的所有內容

我想知道,除了在JDK中編輯實際EventQueue類以外的任何方法,這將允許我們查看當前正在運行的所有代碼塊事件調度線程 - 可能是某種類型的工具,它允許我們在進入或離開事件調度線程時查看事件?

+1

你試過傾銷Java程序的堆棧時凍結? http://java.sun.com/developer/technicalArticles/Programming/Stacktrace/ – jtahlborn 2011-04-18 18:00:23

回答

5

一個有趣的方法是延長EventQueue它和push()它,如圖所示here

+0

這正是我正在尋找的 - 非常感謝你 – 2011-04-18 19:59:48

+0

優秀。令人遺憾的是,這個問題通常圍繞着'不應該發佈到'EventQueue'上的東西,但這種方法可能會提示新的線索。 – trashgod 2011-04-18 20:07:27

2

嘗試使用BTrace來檢測EventQueue並在每次添加事件時捕獲堆棧跟蹤可能是個好主意。我認爲最新的VisualVM有插件,可以讓你用BTrace腳本來測試運行的JVM。

4

記錄通過事件調度線程的所有內容似乎是診斷死機的麻煩方法。難道要等到問題發生後才容易,然後詢問事件調度線程它正在做什麼現在?一種方法是使用enable JMX monitoring,通過JMX客戶端連接到您的運行進程,例如VisualVM(隨JDK提供),等待問題發生,然後take a thread dump

如果您仍然希望記錄所有事件指派線程是幹什麼的,你可以這樣做:

  1. 在Eclipse中,啓動在調試模式下的應用。
  2. EventQueue.dispatchEvent創建一個斷點,右鍵單擊它,選擇「屬性」,檢查「條件」,並輸入以下「條件」:

    System.out.println(arg0); 
    return false; 
    
0

如果您使用的是Oracle JRE,則已經包含TracedEventQueue。你可以將它安裝爲前面提到的:

EventQueue eventQueue = Toolkit.getDefaultToolkit().getSystemEventQueue(); 
eventQueue.push(new TracedEventQueue()); 

注意,這將輸出一個大量輸出 ...

相關問題