Java 2 SDK 開発ガイド (Solaris 編)

SIGQUIT によるデバッグ

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

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
---------
...