torutkのブログ

ソフトウェア・エンジニアのブログ

[Linux]SystemTap 1.1をCentOSのRPMパッケージ化

CentOSには、SystemTap 0.9.7が標準搭載されています。SystemTapの現時点の最新は1.1で、C++のスコープ演算子が利用できるようになった等利用したい機能があるため、SystemTap Ver.1.1のCentOS 5用RPMを作成します。

ソースファイル、旧バージョンのソースRPMの入手

まず、SystemTapのソース(systemtap-1.1.tar.bz2)を以下URLから入手します。

systemtap-0.9.7-5.el5.src.rpmCentOSのミラーyumリポジトリから入手します。例えば以下URL。

また、elfutilsのソースを入手します。systemtapのsrc.rpmにはelfutils-0.141.tar.bz2が含まれていますが、最新版(elfutils-0.144.tar.bz2)を取得しました。

Fedora12の最新ソースRPMの入手
SPECファイルについて参考とするため、Fedora12のsystemtap-1.1のソースRPMFedoraのミラーyumリポジトリから入手します。

systemtap.specの修正

SystemTapのバージョンアップでファイル構成が変化しているので、specファイルを修正する必要があります。今回は、0.9.7のspecファイルをまずはそのまま使ってrpmbuildコマンドでビルドを行い、エラーが出たらFedora12の最新RPMのspecファイルを参照して修正を入れる方法で作業を進めました。

-%{!?elfutils_version: %define elfutils_version 0.141}
+%{!?elfutils_version: %define elfutils_version 0.144}

-Version: 0.9.7
-Release: 5%{?dist}
+Version: 1.1
+Release: 1%{?dist}

-Patch2: rhbz438737.patch
-Patch3: rhbz498018-1.patch
-Patch4: rhbz498018-2.patch
-Patch5: rhbz498018-3.patch
-Patch6: rhbz498040.patch
-Patch7: rhbz499688.patch
-Patch8: rhbz501795.patch
-Patch9: rhbz503225.patch
-Patch10: rhbz504007-1.patch
-Patch11: rhbz504007-2.patch
-Patch12: rhbz504007-3.patch

-%patch2 -p1
-%patch3 -p1
-%patch4 -p1
-%patch5 -p1
-%patch6 -p1
-%patch7 -p1
-%patch8 -p1
-%patch9 -p1
-%patch10 -p1
-%patch11 -p1
-%patch12 -p1

-install -m 644 initscript/config $RPM_BUILD_ROOT%{_sysconfdir}/systemtap
+install -m 644 initscript/config.systemtap $RPM_BUILD_ROOT%{_sysconfdir}/systemtap/config

+%{_bindir}/stap-authorize-signing-cert
+%{_mandir}/man8/stap-authorize-signing-cert.8*

 %files client
   :
-%{_bindir}/stap-find-servers
-%{_bindir}/stap-find-or-start-server
-%{_bindir}/stap-add-server-cert
-%{_bindir}/stap-client-connect
-%{_mandir}/man8/stap-server.8*
+%{_bindir}/stap-authorize-server-cert
+%{_libexecdir}/%{name}/stap-find-servers
+%{_libexecdir}/%{name}/stap-client-connect
+%{_mandir}/man8/stap-client.8*
+%{_mandir}/man8/stap-authorize-server-cert.8*

 %files server
   :
-%{_bindir}/stap-serverd
-%{_bindir}/stap-start-server
-%{_bindir}/stap-stop-server
-%{_bindir}/stap-gen-server-cert
-%{_bindir}/stap-server-connect
+%{_libexecdir}/%{name}/stap-serverd
+%{_libexecdir}/%{name}/stap-start-server
+%{_libexecdir}/%{name}/stap-find-or-start-server
+%{_libexecdir}/%{name}/stap-stop-server
+%{_libexecdir}/%{name}/stap-gen-cert
+%{_libexecdir}/%{name}/stap-server-connect
+%{_libexecdir}/%{name}/stap-sign-module

 %files sdt-devel
   :
-%doc initscript/README.initscript
+%doc initscript/README.systemtap

C++のスコープ演算子を使用

例えば、

probe process("/home/torutk/bin/myapp").function("MyClass::*") {
    printf("MyClassのメンバ関数が呼び出されました\n")
}

のように指定できます。