このトピックでは、クラッシュがAWTに関連しているかどうかを確認する方法、およびこのようなクラッシュをトラブルシューティングする方法について説明します。
AWTのクラッシュを識別するには:
クラッシュが発生すると、そのクラッシュの発生時に取得された情報や状態を含むエラー・ログが作成されます。致命的エラー・ログ・ファイルの詳細は、付録Aを参照してください。
このファイルの先頭付近の行には、エラーが発生したライブラリが示されます。例10-3は、クラッシュがAWTライブラリに関連している場合のエラー・ログ・ファイルの一部を示しています。
例10-3 AWTライブラリ・クラッシュのエラー・ログ
... # Java VM: Java HotSpot(TM) Client VM (1.6.0-beta2-b76 mixed mode, sharing) # Problematic frame: # C [awt.dll+0x123456] ...
ただし、システム・ライブラリ内のどこか深い場所でクラッシュが発生しても、その原因がやはりAWTである場合もあります。このような場合、awt.dll
が問題フレームとして指摘されず、例10-4に示すように、ファイルのStack: Native frames: Java frames
セクションをさらに調べる必要があります。
例10-4 スタックのネイティブ・フレームのエラー・ログ
Stack: [0x0aeb0000,0x0aef0000), sp=0x0aeefa44, free space=254k Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code) C 0x00abc751 C [USER32.dll+0x3a5f] C [USER32.dll+0x3b2e] C [USER32.dll+0x5874] C [USER32.dll+0x58a4] C [ntdll.dll+0x108f] C [USER32.dll+0x5e7e] C [awt.dll+0xec889] C [awt.dll+0xf877d] 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 V [jvm.dll+0x83c86] V [jvm.dll+0xd870f] V [jvm.dll+0x83b48] V [jvm.dll+0x838a5] V [jvm.dll+0x9ebc8] V [jvm.dll+0x108ba1] V [jvm.dll+0x108b6f] C [MSVCRT.dll+0x27fb8] C [kernel32.dll+0x202ed] Java frames: (J=compiled Java code, j=interpreted, Vv=VM code) 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
ネイティブ・フレーム内のどこかにテキストawt.dll
が現れた場合、そのクラッシュはAWTに関係している可能性があります。
AWTのクラッシュをトラブルシューティングするには:
AWTクラッシュの大部分はWindowsプラットフォーム上で発生しますが、それらの原因はスレッドの競合です。これらの問題の多くがJava SE 6で修正されたので、以前のリリースでクラッシュが発生した場合はまず、その問題がすでに最新リリースで修正されているか確認してみてください。
考えられるクラッシュの原因の1つは、AWTの多くの操作が非同期であることです。たとえば、frame.setVisible(true)
を呼び出してフレームを表示させる場合、この呼出しから戻った後でそのフレームがアクティブ・ウィンドウになっている保証はありません。
もう1つの例は、ネイティブのファイル・ダイアログに関するものです。オペレーティング・システムがこれらのダイアログを初期化して表示するまで多少の時間がかかるため、setVisible(true)
を呼び出してすぐにそれらを破棄してしまうと、クラッシュが発生する可能性があります。したがって、アプリケーション内にいくつかのAWT呼出しがあり、それらが同時に実行されたり短時間に連続して実行されたりする場合には、呼出しの間にある程度の遅延を挿入したり、何らかの同期を追加したりすることをお薦めします。