PTRACE(2) FreeBSD システムコールマニュアル PTRACE(2)
名称
ptrace − プロセスのトレースとデバッグ |
ライブラリ
標準 C ライブラリ (libc, −lc) |
書式
#include <sys/types.h> int |
ptrace(int request, pid_t pid, caddr_t addr, int data); |
解説 |
ptrace() システムコールはトレースとデバッグの機能を提供します。これによっ て 1 つのプロセス (トレースするプロセス) が他のプロセス (トレースされるプ ロセス) を制御できます。トレースするプロセスは、最初にトレースされるプロ セスにアタッチしなければなりません。それから、そのプロセスの実行を制御す るために ptrace() システムコールを発行します。プロセスのメモリおよびレジ スタ状態へのアクセスも同様です。トレースするセッションの期間中、トレース されるプロセスはその親プロセス ID が (その結果の動作として) トレースする プロセスに ‘‘親を変更’’ されます。トレースするプロセスが同時に 1 つ以上の プロセスをアタッチすることは、許可されます。トレースするプロセスがその作 業を完了したときには、そのトレースされるプロセスをデタッチしなければなり ません。トレースするプロセスが最初にアタッチされている全てのプロセスをデ タッチせずに exit した場合には、それらのプロセスは kill されます。 ほとんどの場合、トレースされるプロセスは正常に実行されます。ただし、ト レースされるプロセスはシグナル (sigaction(2) を参照) を受信すると停止しま す。トレースするプロセスは、 wait(2) または SIGCHLD シグナルによってこれ を検知し、停止されたプロセスの状態を調査して、それを終了させるか、または 適切な形で実行を継続させます。そのシグナルは、トレースされるプロセスの動 作の結果として生成されたか、 kill(2) システムコールの使用による、通常のプ ロセスのシグナルかもしれません。もしくは、アタッチ、システムコール、また はトレースするプロセスによるステップの結果、トレースする仕組みによって生 成されたものかもしれません。トレースしているプロセスは、そのシグナルを使 用してプロセスの動作を観測するために (SIGTRAP の様に) そのシグナルを横取 りするか、もし適切であればそのシグナルをそのプロセスに転送するかを、選択 できます。 ptrace() システムコールは、これらすべてを制御するメカニズムで す。 request 引数は、どの操作を実行するかを指定します。残りの引数の意味は操作 によって異なります。後述する 1 つの特殊なケースを除いて、 ptrace() 呼び出 しはすべてトレースするプロセスによって行われ、 pid 引数はトレースされるプ ロセスのプロセス ID を指定します。 request 引数は次のものにできます。 |
PT_TRACE_ME
この要求は、トレースされるプロセスが使用する唯一の要求で す。この要求は、プロセスがその親によってトレースされること を宣言します。他の引数はすべて無視されます (親プロセスが子 プロセスをトレースしない場合は、かなり混乱した結果になりま す。トレースされるプロセスが停止すると、このプロセスは、 ptrace() によってしか実行を継続できません)。プロセスがこの 要求を使用し、 execve(2) またはそれに組み込まれているルーチ ン (たとえば、 execv(3)) を呼び出した場合、そのプロセスは新 しいイメージの最初の命令を実行する前に停止します。また、実 行される実行可能モジュールの setuid または setgid ビットは 無視されます。 PT_READ_I, PT_READ_D PT_WRITE_I, PT_WRITE_D PT_IO struct ptrace_io_desc { |
int |
piod_op; |
/* I/O 操作 */ |
|||
void |
*piod_offs; |
/* 子オフセット */ |
|||
void |
*piod_addr; |
/* 親オフセット */ |
|||
size_t |
piod_len; |
/* 要求の長さ */ |
}; /* |
#define PIOD_READ_D |
1 |
||||
/* データ空間からの読取り */ |
|||||
#define PIOD_WRITE_D |
2 |
||||
/* データ空間への書込み */ |
|||||
#define PIOD_READ_I |
3 |
||||
/* 命令空間からの読取り */ |
|||||
#define PIOD_WRITE_I |
4 |
||||
/* 命令空間への書込み */ |
data 引数は無視されます。実際に読み書きされたバイト数は、上 記の piod_len に入れられ返されます。 |
PT_CONTINUE
トレースされるプロセスは実行を継続します。 addr
引数は、実 行が再開される場所
(プログラムカウンタの新しい値)、または実
行が停止されたところで再開されることを示す ( PT_STEP PT_KILL PT_ATTACH PT_DETACH PT_GETREGS PT_SETREGS PT_GETFPREGS PT_SETFPREGS PT_GETDBREGS PT_SETDBREGS PT_LWPINFO struct ptrace_lwpinfo { |
lwpid_t |
pl_lwpid; |
/* LWP 識別子 */ |
|||
int |
pl_event; |
/* 受け取ったイベント */ |
}; data 引数は、呼び出し側に知られている構造体の大きさに設定さ れます。これにより、古いプログラムに影響を与えること無し に、この構造体を大きくすることができます。 さらにマシン固有の要求が存在することがあります。 |
戻り値
いくつかの要求で ptrace() はエラー以外の場合にも −1 を返します。曖昧さを なくすためには、呼び出しの前に errno を 0 に設定し、後でチェックします。 |
エラー
ptrace() システムコールは次の場合に処理に失敗します。 |
[ESRCH]
• 指定されたプロセス ID を持つプロセスが存在しませ ん。 [EINVAL] [EBUSY] [EPERM] 関連項目 |
execve(2), sigaction(2), wait(2), execv(3), i386_clr_watch(3), i386_set_watch(3) |
歴史
ptrace() 関数は Version 7 AT&T UNIX で登場しました。 FreeBSD 10.0 August 11, 2003 FreeBSD 10.0 |