Fedora Coreにはdebuginfoパッケージというものがある。普通にrpmbuildなどでコンパイルすると、いつの間にかできてしまうので邪魔に思う人も多いかもしれない。実際、インストールしなくても全然構わない。
debuginfoパッケージを作らないようにするには、$HOME/.rpmmacrosに
%debug_package %{nil}
と書くとよい。…でも、たくさんあるってことは便利に使えるってことなんだろう、というのが本日の議題。書いとかないと忘れてしまうしね。
debuginfoが威力を発揮するのは正にデバッグのときだ。しかし普段はデバッグなどはしないわけなので、別パッケージにして塩漬けにしておく。それがdebuginfo。で、ゲロ(core)を吐いたときに使う。
例えば、bashがゲロを吐いて落ちたとしよう。「unlimit -c unlimited」としておかないとゲロを吐かないようになっているんだけど、まあ吐いたことにして。
セグメンテーション違反です (core dumped)
「core.プロセスID」というファイルができる。普通はこのファイルを使って、
# gdb `which bash` core.プロセスID : (gdb) bt :
などとやる。しかしこれではソースの場所がわからない。rpmに入っているバイナリはstripされているので、行番号の情報は捨てられてしまっている。
こういうときにdebuginfoを使う。coreを確認したら、おもむろにdebuginfoパッケージをインストールして、デバッガからはdebuginfoの中にあったバイナリを参照する。
# sudo yum -y install bash-debuginfo : # gdb /usr/lib/debug/bin/bash.debug core.プロセスID : (gdb) bt :
で、行番号が出てくる。デバッグ中と同じようにデバッガからソースを見ることもできて、なかなか便利なのだ。
あるいはgdbでattachするときに使ってもいい。
だから、debuginfoはゲロができる前にインストールしておく必要は全くないんだけど、邪険に扱わないで下さい。
でもrpm -Uvh hogehoge-*.rpmとかワイルドカードでファイルを指定してインストールしたいのに、debuginfoがあると邪魔じゃんか、という方は、普段インストールするときにrpm -Uvh hogehoge-*.rpmのようにしておいて、「rpm -qa | grep -- -debuginfo- | xargs rpm -e」みたいなことを書いたスクリプトをcron.dailyの下に置いておくなりすれば、放っておくだけで削除されるようになります。