コアがない
UNIXでプログラムにバグがあり,SEGVを起こした場合,通常はメモリイメージがコアファイルに書き出されるので,それをデバッガに食わせて,デバッグする.まぁ,最近のLinux distroだとコア出力はデフォルトで無効になっているので,ulimitを変更する必要がある.
では,Plan9ではプログラムが異常終了した場合,どのようになるのか見て行こう.サンプルは次のようなプログラム.0番地に書き込むので,UNIXだとSEGVが発生するはずだ.
#include <u.h> #include <libc.h> void foo(void) { int *p = 0; p[0] = 1; } void main() { foo(); }
さて,これを実行すると,次のように表示され,プログラムは終了する.
term% 8c segv.c term% 8l segv.8 term% 8.out 8.out 266: suicide: sys: trap: fault write addr=0x0 pc=0x00001025
UNIXだとここでコアファイルを出力し,プロセスは終了するが,Plan9の場合,異常終了しても,プロセスはBrokenという状態になり,メモリイメージが残される(ページはスワップアウトして,PCBだけが残った状態なんだろうけど).つまり,デバッグはこのプロセスにアタッチすればよい.
term% ps : oraccha 266 0:00 0:00 8K Broken 8.out
Brokenプロセスはいつまで残っているのだろうか?
broke(1)コマンドを使って,現在存在するBrokenプロセスを調べることができる.
term% broke kill>/proc/266/ctl
後始末で書いたように,kill(1)と同様にbrokeの出力をrcに食わせれば,Brokenプロセスを殺すことができる.
term% broke | rc
あと,後で解析するために,コアファイルのような形で保存しておくことはできるのかな?