Java 2 SDK Solaris 版には、新しいデバッグプロセスが採用されています。このプロセスでは、フォアグラウンドで動作する Java プロセスに SIGQUIT シグナルが送信されます。このシグナルを受けたプロセスは、次のメニューを表示して、一時停止し、ユーザ入力を待ちます。
1: Terminate program 2: Find & print one deadlock 3: Find & print all deadlocks 4: Print thread stacks 5: Print lock registry 6: Continue program |
Java レベルのデッドロック (2 つ以上のスレッドがモニタに対して周期的待ち状態になる) が発生しているかどうかを調べるには、2 番目と 3 番目のオプションを使用します。マルチスレッドの Java プログラムでは、同期メソッドを注意して使用しないと、この種のデッドロックが発生することがあります。
4 番目のオプションでは、システム上のアクティブなスレッドの一覧が提供され、それらスレッドの Java スタックトレースを選択して取得することができます。
5 番目のオプションでは、VM の内部ロックのダンプが生成されます。この情報は、VM に関連するバグなどの問題のレポートを作成するときに役立てることができます。
SIGQUIT シグナルは、kill(1) を使用するか、フォアグラウンドプロセスで Ctrl-バックスラッシュを入力することによって送信することができます。
バックグラウンドで動作する Java プロセスに SIGQUIT シグナルを送信した場合は、単に上記オプションの 3、4、5 の出力が標準エラーデバイスにダンプされるだけです。プログラムは、ユーザに入力を求めることなく動作を続行します。
Java プロセスが SIGQUIT を受信した後の一般的なユーザの対話としては以下が考えられます。
... ^¥SIGQUIT SIGQUIT が受信されると、ユーザは以下のどれかの操作を選択することができます。 1) terminate program 2) check & print one deadlock 3) check & print all deadlocks 4) dump thread stacks 5) dump lock registry 6) continue program Select Action: 2 Found 0 deadlock --------- 行う処理を選択します。 1) terminate program 2) check & print one deadlock 3) check & print all deadlocks 4) dump thread stacks 5) dump lock registry 6) continue program Select Action: 4 Java スレッドの一覧: -------------------- [Thread# 1] t@9: (0xef715af4) GC 式のスレッドまたは破壊されたスレッド [Thread# 2] t@8: "Thread-4" [Thread# 3] t@7: "SoftReference sweeper" [Thread# 4] t@6: "Finalizer" [Thread# 5] t@5: "Reference handler" [Thread# 6] t@4: "Signal dispatcher" [Thread# 7] t@1: "main" スレッドスタックをダンプするには、インデックス (1 〜 7) を選択します。 7 以上の値を入力すると、前のメニューに戻る: 7 "main" (TID:0x36adc, sys_thread_t:0x36a50, state:R, thread_t: t@1, threadID:0x20f68, stac k_bottom:0xf0000000, stack_size:0x20000) prio=5 [1] java.lang.Thread.yield(Thread.java) [2] PingPoll.run(Compiled Code @ 0x117300) [3] PingPoll.main(Compiled Code @ 0x1172c8) ------------------- スレッドスタックをダンプするには、インデックス (1 〜 7) を選択します。 7 以上の値を入力すると、前のメニューに戻る: 8 --------- 行う処理を選択します。 1) terminate program 2) check & print one deadlock 3) check & print all deadlocks 4) dump thread stacks 5) dump lock registry 6) continue program Select Action: 6 --------- Continuing Program --------- ... |