何かがスイング スレッドをフリーズさせている場所を追跡できないバグが発生しています (現在ほぼ 2 週間が経過しており、実際の結果はありません) - 私たちは経験豊富な Swing プログラマーですが、巨大なプログラムを持っており、それがレガシーコード
JDK で実際のEventQueue
クラスを編集する以外に、イベント ディスパッチ スレッドで現在実行されているコードのすべての部分を表示できるようにする方法はありますか?イベントディスパッチスレッドに入るか、出ますか?
何かがスイング スレッドをフリーズさせている場所を追跡できないバグが発生しています (現在ほぼ 2 週間が経過しており、実際の結果はありません) - 私たちは経験豊富な Swing プログラマーですが、巨大なプログラムを持っており、それがレガシーコード
JDK で実際のEventQueue
クラスを編集する以外に、イベント ディスパッチ スレッドで現在実行されているコードのすべての部分を表示できるようにする方法はありますか?イベントディスパッチスレッドに入るか、出ますか?
興味深いアプローチの 1 つは、ここEventQueue
にpush()
示すように拡張することです。
イベント ディスパッチ スレッドを通過するすべてをログに記録することは、フリーズを診断するのに面倒な方法のようです。問題が発生するまで待ってから、イベント ディスパッチ スレッドが現在何をしているのかを確認する方が簡単ではないでしょうか? これを行う 1 つの方法は、JMX 監視を有効にし、 VisualVM (JDK に付属)などの JMX クライアントを使用して実行中のプロセスに接続し、問題が発生するのを待ってから、スレッド ダンプを取得することです。
イベント ディスパッチ スレッドが行っていることをすべてログに記録したい場合は、次の方法でこれを行うことができます。
にブレークポイントを作成しEventQueue.dispatchEvent
、右クリックして「プロパティ」を選択し、「条件」をチェックして、次の「条件」を入力します。
System.out.println(arg0);
return false;
BTraceを試して EventQueue を計測し、何かが追加されるたびにスタック トレースを取得することをお勧めします。最新の VisualVM には、BTrace スクリプトを使用して実行中の JVM を計測できるプラグインが含まれていると思います。
Oracle JRE を使用している場合は、既に含まれているTracedEventQueueがあります。前述のようにインストールできます。
EventQueue eventQueue = Toolkit.getDefaultToolkit().getSystemEventQueue();
eventQueue.push(new TracedEventQueue());
これは多くの出力を出力することに注意してください...