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が動いてないっぽいけど。