okkyの日記: gdb generate-core-file / gcore
定期的に問題になるのが、今生きている(正確には暴走している)プロセスのコアを吐かせつつ、何が起こるか判らないのでそのプロセスを可能な限り止めないためにはどうすればよいか、という問題。
そのたびに google 様にお世話になり、そのたびに
「あぁ、そういえば前にも同じ事を…」
と思うのだが、すぐ忘れ…
というわけで、さすがに備忘録。
/usr/bin/gcore というスクリプトがある。
これは、gdb の generate-core-file 命令( short name は gcore )を利用してコアを生成する。
gcore機能は gdb 5.2.1 から入ったらしい。
2003年8月の日経Linuxの記事として、Miracle Linuxがgdbをversion upしてgcore.shを追加した、とある。これ自体は Miracle Linuxのホームページにある。
attach PID
gcore core.file.name
detach
が基本的な使い方。
とはいえ、これは暴走している process とかにしか使えない。『SIGPIPEを受けたら』なんてタイミングでのダンプには使えない。いや、おそらく全部gdb上で動かして、SIGNALを受けたらgdbに制御が帰ってくるのでそのタイミングで gcore コマンドを使うなら可能なのだろうが…1process 1gdbというわけにはいかないし。
またマルチスレッドの場合どうなるのかも不明。出力イメージは多分楽しいものになっているのではないかと予想される。
なお、類似品にGoogle Coredumperというものもあります。これはライブラリとして使えるライブダンプである、というのが特徴のようです。これならマルチスレッドであっても、スレッドを自由に制御した上でコアを吐かせることができますね。
備忘録の備忘録
「SIGPIPEを受けたプロセスのコア」なんて必要ないんじゃないか、と思う人もいるかもしれないが…というのは、SIGPIPEは pipe で繋がった2つのプロセスの内「データを受け取る側」のプロセスが死亡していた場合、「データを送る側」のプロセスに発生する signal だから。悪いのは「死んだほう」だろう?というわけ。それはその通りなのだが、「データを受け取る側」が死んだ原因を作ったのは「データを送った側」の『前回送信したデータ』かもしれない。何を送ったのか、ヒントになる情報が残っているかもしれないので、送り側の情報も欲しくなることがあるのだ。
昔、SIGKILL と SIGSTOP 以外のどの割り込みでも、プロセスを停止させるときは core を吐くかどうか制御できるようにしたパッチを作ったことがあったが…あれはどこの本棚に入っているんだっけか。もう一度作り直して、LKMLに出してみようかなぁ。
でも、あれ、プロセスを殺しちゃうんだよなぁ。よくないよなぁ。
gdb generate-core-file / gcore More ログイン