ablog

不器用で落着きのない技術者のメモ

SystemTap を使おうとすると"Missing separate debuginfos"とエラーが出る

こんなスクリプトを作って、

[root@www****** ~]# cat diskstats_show.stp 
#!/usr/bin/stap -v
probe kernel.statement("*@*block/genhd.c:1078") {
        print_backtrace()
}

実行すると、

[root@www****** ~]# ./diskstats_show.stp 
Pass 1: parsed user script and 86 library script(s) using 98700virt/24108res/2952shr/21500data kb, in 160usr/10sys/168real ms.
semantic error: while resolving probe point: identifier 'kernel' at ./diskstats_show.stp:2:7
        source: probe kernel.statement("diskstats_show@block/genhd.c:1078") {
                      ^

semantic error: missing x86_64 kernel/module debuginfo under '/lib/modules/2.6.32-358.18.1.el6.x86_64/build'
Pass 2: analyzed script: 0 probe(s), 0 function(s), 0 embed(s), 0 global(s) using 104120virt/29224res/4768shr/24816data kb, in 50usr/100sys/156real ms.
Pass 2: analysis failed.  Try again with another '--vp 01' option.
Missing separate debuginfos, use: debuginfo-install kernel-2.6.32-358.18.1.el6.x86_64 

とエラーが出た。

以下のように回避してインストール。

debuginfo-install --nogpgcheck --enablerepo debug glibc-2.12-1.47.el6_2.5.x86_64

nogpgcheck は普段使わないリポジトリを有効にするオプションです。
/etc/yum.repos.d/*.repo に記載されている無効("enabled=0")のリポジトリ を一回限り有効にします。
ここでは具体的には
/etc/yum.repos.d/CentOS-Debuginfo.repo
の debug セクションを一時的に有効にしています。

nogpgcheck はgpg署名の検査を無効にして実行するオプションです。

CentOS6.2でgdb | ぷろぐらま

を参考に debuginfo をインストールして、

[root@www****** ~]# debuginfo-install --nogpgcheck --enablerepo debug kernel-2.6.32-358.18.1.el6.x86_64 
...

Installed:
  kernel-debuginfo.x86_64 0:2.6.32-358.18.1.el6                   yum-plugin-auto-update-debug-info.noarch 0:1.1.30-14.el6                  

Dependency Installed:
  kernel-debuginfo-common-x86_64.x86_64 0:2.6.32-358.18.1.el6                                                                               

Complete!

リトライしてみると、

[root@www****** ~]# ./diskstats_show.stp 
Pass 1: parsed user script and 86 library script(s) using 98700virt/24108res/2952shr/21500data kb, in 150usr/10sys/157real ms.
Pass 2: analyzed script: 1 probe(s), 1 function(s), 0 embed(s), 0 global(s) using 268908virt/79732res/17892shr/63468data kb, in 220usr/110sys/329real ms.
Pass 3: translated to C into "/tmp/stapd78fzu/stap_9e327733fab96b27495da4a3d840a827_969_src.c" using 268908virt/82024res/20168shr/63468data kb, in 500usr/20sys/524real ms.
Pass 4: compiled C into "stap_9e327733fab96b27495da4a3d840a827_969.ko" in 9500usr/720sys/9109real ms.
Pass 5: starting run.
...

解決!

おまけ

debuginfo でインストールしたカーネルのソースがどこにあるか確認してみた。

[root@www****** ~]# rpm -ql kernel-debuginfo-common-x86_64.x86_64 0:2.6.32-358.18.1.el6|head -10
/usr/src/debug/kernel-2.6.32-358.18.1.el6
/usr/src/debug/kernel-2.6.32-358.18.1.el6/linux-2.6.32-358.18.1.el6.x86_64
/usr/src/debug/kernel-2.6.32-358.18.1.el6/linux-2.6.32-358.18.1.el6.x86_64/arch
/usr/src/debug/kernel-2.6.32-358.18.1.el6/linux-2.6.32-358.18.1.el6.x86_64/arch/x86
/usr/src/debug/kernel-2.6.32-358.18.1.el6/linux-2.6.32-358.18.1.el6.x86_64/arch/x86/crypto
/usr/src/debug/kernel-2.6.32-358.18.1.el6/linux-2.6.32-358.18.1.el6.x86_64/arch/x86/crypto/aes-x86_64-asm_64.S
/usr/src/debug/kernel-2.6.32-358.18.1.el6/linux-2.6.32-358.18.1.el6.x86_64/arch/x86/crypto/aes-x86_64.mod.c
/usr/src/debug/kernel-2.6.32-358.18.1.el6/linux-2.6.32-358.18.1.el6.x86_64/arch/x86/crypto/aes_glue.c
/usr/src/debug/kernel-2.6.32-358.18.1.el6/linux-2.6.32-358.18.1.el6.x86_64/arch/x86/crypto/aesni-intel.mod.c
/usr/src/debug/kernel-2.6.32-358.18.1.el6/linux-2.6.32-358.18.1.el6.x86_64/arch/x86/crypto/aesni-intel_asm.S

参考

Linuxカーネル解析入門 (I・O BOOKS)

Linuxカーネル解析入門 (I・O BOOKS)