2013年5月22日水曜日

/usr/bin/gcoreのバグ(gdb-7.2-56.el6, gdb-7.2-60.el6で確認)

gdbには/usr/bin/gcoreというシェルスクリプトが入っていて、PIDを引数で渡すと、
そのプロセスにアタッチ -> coreファイル作成 -> デタッチ を流してやってくれるというもの。

PIDを複数渡した場合はそれら全てのプロセスに対してこれをやってくれるはずなんだけど、
ちょっとバグがあって上手く行かない。

..
 62 # Loop through pids
 63 for pid in $*
 64 do
 65         # Write gdb script for pid $pid.
 66         cat >>$tmpfile <<EOF
 67 set pagination off
 68 set width 0
 69 set height 0
 70 attach $pid
 71 gcore $name.$pid
 72 detach
 73 quit
 74 EOF
 75
 76         # `</dev/null' to avoid touching interactive terminal if it is
 77         # available but not accessible (SIGTTIN risk)
 78         gdb -x $tmpfile -batch </dev/null
..


テンポラリファイルにgdbコマンドを詰め込んでgdb -xで非対話に食わせるわけだけれども、
これに2つ以上のPIDを渡すと、

1) 1つめのPIDについてgdbコマンドを$tmpfileに書き込む
2) gdb非対話モードで$tmpfileを実行
 2-1) 表示を整えて
 2-2) 1つめのPIDにアタッチして
 2-3) core吐かせて
 2-4) デタッチして
 2-5) gdbを終了
3) 2つめのPIDについて、gdbコマンドを$tmpfileに追記する
4) gdb非対話モードで$tmpfileを実行
 4-1) 2-1~2-5をやる
 4-2) gdbが既に終了しているので2つ目のPIDについて$tmpfileに追記された部分は読み取られない
5) 3つ目のPIDについて..


Σ(゚д゚lll) ダメじゃん!?

66行目の>>を>に書き換えたらちゃんと動きました。
bug-gdbでも誰も何も言わないというのは、まあ誰も使わないってことだろうか。

https://lists.gnu.org/mailman/listinfo/bug-gdb/


MySQL Bugs、簡単に投稿出来て良いなぁとか思った。
でもMySQLのバグメーリングリストは死んでるよね。
もともとはBugsに上げたらMLにも投げよう、とかそういう感じだった気がするんだけども。

0 件のコメント :

コメントを投稿