コアがない

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

あと,後で解析するために,コアファイルのような形で保存しておくことはできるのかな?