死んだプロセスのスタックトレースを自動収集するデーモンを書いた (そして、その出力を開発者に送ってあげると喜ばれるよという話)

死んだプロセス (あるいは kill したプロセス) の core イメージから自動的にスタックトレースを収集するデーモンを書いたので、これをセットアップしてサーバにインストールしとくといいかもです (kaztools/bt_cores at master · kazuho/kaztools · GitHub)。Linux のみ対応*1。使い方は bt_cores --help とするか、perl Makefile.PL && make install して man bt_cores。

具体的にいうと、Q4M とか Incline とか kazuho product が落ちたり固まったりしたらスタックトレース送ってくれると、私がうれしいです (古いバージョンのスタックトレースだととても悲しいです)。コアファイルは内部データがいろいろ入ってるから外部の人には見せられないけど、スタックトレースならテキストファイルだから、やばいとこだけ伏せ字にして送ってくれますよね? えへ。

... ということで解決するはずだったんですが ...

MySQL の場合は MySQL Bugs: #21723: Should be able to dump core after setuid() under Linux が直ってないのを忘れてた。↑の方法は使えない ToT

しょうがないので Q4M が固まった場合は、

% echo 'thread apply all bt' > allbt.cmd

のようにして gdb のコマンドをあらかじめファイルに書き出していて、あとは

% sudo gdb -batch -x tmp/allbt.cmd /usr/local/mysql/libexec/mysqld `sudo cat /usr/local/mysql/data/localhost.pid` > stacktrace.txt

のようして全スレッドのスタックトレースが取って送ってください。この方法だと、SEGV で死んじゃったりした場合の情報が得られないのが痛いですが。なにはともあれ、よろしくお願いします。

*1:あと OSX でも動くけど説明書いてない