Monaは最近(2010年5月現在)ぬるぽで「ガッ」てなってもプロセスを殺さなくなりました。
そろそろgdbの季節だとは思うのですが、その作業はちょっと自分でやる気は起こらない。
スタックトレースの表示がそろそろ欲しい。
デバッグ技法/落ちた場所を特定するでは、最後に落ちた場所は分かるのですが、それがどこから呼ばれているのか分かりません。
これでは大規模な物を作るのはちょっと厳しい。
gdbサポートがなったあかつきにはサックリ捨てられるように手は抜いて、でもカーネルに入れるので挙動自体はきっちりと、という方針でいきます。
mapファイルのパース回りは将来プロファイラが必要なフェーズまでMonaが進んだ時にしばらくは使えるように、という意識を(一応)しています。
以下のようなAPIを考えています。
extern bool syscall_stack_trace_enable(uint32_t pid, const char* map_file_path);
extern void syscall_stack_trace_disable(uint32_t pid);
enableが呼ばれるとカーネル側でマップファイルをパースしたデータ構造を持ち、落ちた時にそのデータ構造から名前をひっぱって表示して終了します。
この時、勝手にデータ構造は解放します。
正常終了時には解放しないので、手でsycall_stack_trace_disableを呼んでやる必要があります。
存在しないpidへのdisable呼び出しは単純に無視されます。
一応別プロセス(シェルとか)からenableするようなユースケースも考えて、pidを指定するようになっています。
なお、使用する時はbin下にmapファイルをいちいち入れるのも面倒なので、FileReceiverを使って/MEM下においてそこをmainの先頭でハードコードしてやるのが現時点の実用上は楽です。
本家へのマージ
使ってみると意外と便利なので、むしろデフォルトでONにしてしまおうか、という気もしています。
マップファイルを指定しないとアドレスの一覧を出すだけで。
外のモジュールとかもおっかける気があるなら案2が便利か、とも思いますが、一方でFileReceiverでRamDiskにmapファイルを送り込んでenableすればいいだけなので、再現が簡単に出来る状況なら現状でもあまり困りはしません。
マージ作業の為の備忘録。branchは切りませんでした(すみません…)
http://github.com/mumurik/mona/commit/380990f947dcd180be42fa83e8a40d46b4e8c849
http://github.com/mumurik/mona/commit/e1f17f29cd7c8af12ce6a73d5c1f04d371f59353
http://github.com/mumurik/mona/commit/fe51adc00e073050ed7acbb97f4bdd692fa403b3
http://github.com/mumurik/mona/commit/c4d10e2e754cafe7f9b11aafcd298532c0bfeed0
http://github.com/mumurik/mona/commit/aa68f60fa5b43b90c1642598c4c93e69b62aa536
http://github.com/mumurik/mona/commit/eb9b7606dcb5748a1247b1067d89e9f454494f81
http://github.com/mumurik/mona/commit/7e187a834d7e492666cdb8da54b1e0ec2f370ba0
http://github.com/mumurik/mona/commit/450b3e0088659e3c1ebf699f9d8c1cf39be1e789
http://github.com/mumurik/mona/commit/5d862ee1c6f08ce7568f1a2902aec225eacad19a
コメントはありません。 コメント/議論/スタックトレース?