05:37:53 # Life openシステムコールを解析するのに利用するのは, ptraceを使おうか,LD_PRELOADを使おうか,検討をしてみる. Linux kernelの中で,ptraceについて参考になるソースは,おそらく arch/um/kernel/ptrace.c, arch/um/kernel/process.c あたり. ptrace(2) マニュアルページも参考になる. 子プロセスをforkで作成して,ptrace可能である,と宣言してから,execする. 子プロセスがシグナルをうけると停止し, 親プロセスはwait()の際に通知される.
雰囲気から察すると,ptraceでシステムコールの分析をする際には, システムコールを実行するまえの瞬間にトラップをしかけることができ, その際にレジスタの各値を取得できるというインタフェースになっているらしい. つまり,システムコールの値と,レジスタの意味という情報が必要になる. この情報は各OS,CPUアーキテクチャ毎に違い, ptraceというインタフェースが一般的に存在しているといっても 汎用的ではない.
システムコール経由で解析しようとするより, LD_PRELOADでlibcのopen関数をオーバライドするほうがより現実的のように思える. ppcだったら pt_regs.gpr の何番目に何が入っているのか, というのを全て洗い出してデバッグするのは手間がかかる. x86だったら,eaxにシステムコール番号があり, ebxに一つ目のパラメータがあり,というような話し.
LD_PRELOAD | ptrace | |
openが呼ばれた状態の追跡 | 可能 | 可能 |
openシステムコールをアプリケーションコードが直接呼んだ場合 | 不可 | 可能 |
suidアプリケーションの追跡(例:gpg) | 不可 | 不可? |
static linkアプリケーションの追跡 | 不可 | 可能 |
アプリケーション側からのトレースからの回避方法 | LD_PRELOAD環境変数のリセットなど(lddなど) | ? |
forkされた場合の処理 | 継続 | attachしなおす必要あり(空白の時間が発生?) |
過去の事例 | fakeroot, fakechroot, auto-apt | gdb, user-mode-linux |
17:16:46 # Life 帰りのエールフランスでのできごと. 画面でWindows CE Boot Loader, v2.7の起動画面がくりかえし表示される. 映画はどこにいった?
$Id: dancer-diary.el,v 1.89 2005/05/12 11:19:14 dancer Exp $