debuginfoの使い方など

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の下に置いておくなりすれば、放っておくだけで削除されるようになります。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です