strace
まぁLinuxに限らず*nixで動くんだけど,あるプログラムにおいてsyscallがどんな具合で実行されたかを見やすく表示してくれるツール.こいつのソースが読みたい*1.
- http://cvs.sourceforge.net/viewcvs.py/strace/strace/linux/syscallent.h?view=markup syscall番号 → 名前の対応表
- http://cvs.sourceforge.net/viewcvs.py/strace/strace/defs.h?view=markup ここの
struct tcb
が主要データ構造らしい
[nodakai@sprawl mp3]$ strace ls execve("/bin/ls", ["ls"], [/* 60 vars */]) = 0 (略 open(".", O_RDONLY|O_NONBLOCK|O_LARGEFILE|O_DIRECTORY) = 3 fstat64(3, {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0 fcntl64(3, F_SETFD, FD_CLOEXEC) = 0 getdents64(3, /* 8 entries */, 4096) = 384 getdents64(3, /* 0 entries */, 4096) = 0 close(3) = 0 fstat64(1, {st_mode=S_IFREG|0644, st_size=3932, ...}) = 0 mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x40015000 write(1, "dietrich_fischerdieskau\ndietrich"..., 198dietrich_fischerdieskau (← このへん,実際のwrite(2)の出力が混じってる dietrich_fischerdieskau-schubert_winterreise.m3u js_bach js_bach-johannespassion_cd1.m3u mischa_maisky_violincello mischa_maisky_violincello-cellosuiten_no1no3no5_jsbach.m3u ) = 198 close(1) = 0 munmap(0x40015000, 4096) = 0 exit_group(0) = ?
*1:「物理実験の基礎第一」のテスト勉強をするよりは.