Jockeyインストール
いやなブログ: Jockey で Linux のプログラムの実行を記録・再生するで紹介されていたJockeyをインストールしてみた。
最初そのままコンパイルしたら、
make[1]: ディレクトリ `/home/nozom/rpm/BUILD/jockey-0.8.1/jtrace' に入ります /bin/sh /home/nozom/rpm/BUILD/jockey-0.8.1/libtool --mode=compile --tag=CXX g++ -I. -I. -D_GNU_SOURCE -D__THROW_BAD_ALLOC="abort()" -D_GLIBCXX_DEBUG -I/home/nozom/rpm/BUILD/jockey-0.8.1 -g -Wall -Wformat -Wno-deprecated -Wno-sign-compare -fno-exceptions -DJOCKEYIMPL -c jtrace.cc mkdir .libs g++ -I. -I. -D_GNU_SOURCE "-D__THROW_BAD_ALLOC=abort()" -D_GLIBCXX_DEBUG -I/home/nozom/rpm/BUILD/jockey-0.8.1 -g -Wall -Wformat -Wno-deprecated -Wno-sign-compare -fno-exceptions -DJOCKEYIMPL -c jtrace.cc -fPIC -DPIC -o .libs/jtrace.o jtrace.cc: In function `void Flush()': jtrace.cc:83: error: no class template named `vanillasyscalls' in `interposer' jtrace.cc: In function `void WriteTypedValue(jtrace::ArgType, long long unsigned int, long long unsigned int)': jtrace.cc:136: warning: cast to pointer from integer of different size jtrace.cc:144: warning: cast to pointer from integer of different size jtrace.cc:149: warning: cast to pointer from integer of different size jtrace.cc:152: warning: cast to pointer from integer of different size jtrace.cc:179: warning: cast to pointer from integer of different size jtrace.cc: In function `void jtrace::Log(const char*, jtrace::ArgType, ...)': jtrace.cc:278: error: no class template named `vanillasyscalls' in `interposer' make[1]: *** [jtrace.lo] エラー 1 make[1]: ディレクトリ `/home/nozom/rpm/BUILD/jockey-0.8.1/jtrace' から出ます make: *** [all] エラー 2
というエラーが出て、調べてみるとinterposer/interposer.vanillasyscalls.hの中身が空っぽだった。さらに原因を辿ると、gen.interposer.errno.cc.rbの実行に失敗していることが分かった。このスクリプトはどうやら/usr/include/asm/errno.hから#includeの依存関係を辿って#defineされているシンボルを抜き出して処理をしているらしい。ところが、手元のマシン(VineSeed Kernel 2.6.12-0vl11)だと/usr/include/asm/errno.hの内容が
#ifndef _I386_ERRNO_H #define _I386_ERRNO_H #ifndef _LINUX_ERRNO_H #include <linux/errno.h> #endif #endif
となっていて、#includeの行頭の空白がうまく扱えていないようだ。正規表現をいじってこれを扱えるようにすると、今度は/usr/include/linux/errno.hの最後で#include
- jockey-0.8.1-errno.patch
--- jockey-0.8.1/interposer/gen.interposer.errno.cc.rb 2005-12-22 03:41:21.000000000 +0900 +++ jockey-0.8.1.mod/interposer/gen.interposer.errno.cc.rb 2006-01-23 05:19:01.000000000 +0900 @@ -13,7 +13,8 @@ fd = TmpFile.new(ARGV[0]) errnos = {} -parseFile("/usr/include/asm/errno.h", errnos) +#parseFile("/usr/include/asm/errno.h", errnos) +parseFile("/usr/include/linux/errno.h", errnos) raise Exception, "errnos not found" if errnos.empty? fd.write <<EOD
その後ドキュメントのインストールにhelp2manが必要だったのでこれもインストールして、ようやくJockeyのインストールが成功した*1。
そうそう、help2manのコンパイルにはconfigureに--disable-nlsオプションを付ける必要があった。そうしないと"libpreloadable_libintl.so required"と言われてconfigureがエラーになる。
動作実験
の前に、以下の準備が必要(kernel-2.6の場合。kernel-2.4の場合はまた違うので、詳しくはINSTALL参照)。もちろんドキュメントに書いてあるようにsysctlを使っても良い。
# echo 0 > /proc/sys/kernel/randomize_va_space # echo 1 > /proc/sys/vm/legacy_va_layout
まずは分かりやすい例から。
% date 2006年 1月 23日 月曜日 08:40:07 JST % jockey date Warning: /bin/date is, by default, excluded from tracing. Warning: I'm adding 'excludedprogram=-' option as a courtesy. 2006年 1月 23日 月曜日 08:40:10 JST % date 2006年 1月 23日 月曜日 08:40:12 JST % jockey --replay=1 date Warning: /bin/date is, by default, excluded from tracing. Warning: I'm adding 'excludedprogram=-' option as a courtesy. 2006年 1月 23日 月曜日 08:40:10 JST
別の例
% jockey cat Warning: /bin/cat is, by default, excluded from tracing. Warning: I'm adding 'excludedprogram=-' option as a courtesy. Hello (とタイプする) Hello % jockey --replay=1 cat Warning: /bin/cat is, by default, excluded from tracing. Warning: I'm adding 'excludedprogram=-' option as a courtesy. Hello
ということで、確かに後から全く同じ実行結果が得られている。これは面白い。…面白いんだけど、具体的にこれを使った面白いアイデアというのはすぐには思いつかないな。
*1:細かいことを言うとjockeyctlとjockeyaccessmemが動いてないっぽいけど。