ptrace(2) FreeBSD 一般コマンドマニュアル

ptrace

前のページ 上に戻る 次のページ

ptrace




書式

     #include <sys/types.h>
     #include <sys/ptrace.h>

     int
     ptrace(int request, pid_t pid, caddr_t addr, int data);


解説

     ptrace() はトレースとデバッグの機能を提供します。これによって 1 つのプロ
     セス (トレースするプロセス) が他のプロセス (トレースされるプロセス) を制
     御できます。ほとんどの場合、トレースされるプロセスは正常に実行されます。
     ただし、トレースされるプロセスはシグナル (sigaction(2) を参照) を受信する
     と停止します。トレースするプロセスは、 wait(2) または SIGCHLD シグナルに
     よってこれを検知し、停止されたプロセスの状態を調査して、それを終了させる
     か、または適切な形で実行を継続させます。 ptrace() は、これらすべてを制御
     するメカニズムです。

     request 引数は、どの操作を実行するかを指定します。残りの引数の意味は操作
     によって異なります。後述する 1 つの特殊なケースを除いて、 ptrace() 呼び出
     しはすべてトレースするプロセスによって行われ、 pid 引数はトレースされるプ
     ロセスのプロセス ID を指定します。 request は次のものにできます。

     PT_TRACE_ME   この要求は、トレースされるプロセスが使用する唯一の要求で
                   す。この要求は、プロセスがその親によってトレースされること
                   を宣言します。他の引数はすべて無視されます (親プロセスが子
                   プロセスをトレースしない場合は、かなり混乱した結果になりま
                   す。トレースされるプロセスが停止すると、このプロセスは、
                   ptrace() によってしか実行を継続できません)。プロセスがこの
                   要求を使用し、 execve(2) またはそれに組み込まれているルーチ
                   ン (たとえば、 execv(3)) を呼び出した場合、そのプロセスは新
                   しいイメージの最初の命令を実行する前に停止します。また、実
                   行される実行可能モジュールの setuid または setgid ビットは
                   無視されます。

     PT_READ_I, PT_READ_D
                   これらの要求は、トレースされるプロセスのアドレス空間から 1
                   つの int データを読み取ります。従来、 ptrace() は命令とデー
                   タについて区別されたアドレス空間のあるマシンを許容していま
                   した。これが 2 つの要求がある理由です。概念的には、
                   PT_READ_I が命令空間から読み取り、 PT_READ_D がデータ空間か
                   ら読み取ります。現在の FreeBSD システムでは、これらの 2 つ
                   の要求は完全に同一です。 addr 引数が、読み取りが行われる (
                   トレースされるプロセスの仮想アドレス空間内の) アドレスを指
                   定します。このアドレスはどのような境界調整制約も満たす必要
                   はありません。読み取られた値は ptrace()からの戻り値として返
                   されます。

     PT_WRITE_I, PT_WRITE_D
                   これらの要求は PT_READ_I および PT_READ_D と同様ですが、読
                   み取るのではなく書き込むところが異なります。 data 引数で書
                   き込まれる値を指定します。

     PT_CONTINUE   トレースされるプロセスは実行を継続します。 addr は、実行が
                   再開される場所 (プログラムカウンタの新しい値)、または実行が
                   停止されたところで再開されることを示す (caddr_t)1 を指定し
                   ます。 data には、トレースされるプロセスが実行を再開すると
                   きに受信するシグナル番号、またはシグナルを送信しない場合に
                   は 0 を指定します。

     PT_STEP       トレースされるプロセスは 1 命令ずつステップ実行されます。
                   addr には (caddr_t)1 を渡す必要があります。 data フィールド
                   は使用されません。

     PT_KILL       トレースされるプロセスは、あたかも SIGKILL を配信シグナルと
                   して PT_CONTINUE が使用されたかのように、終了します。

     PT_ATTACH     この要求は、他の無関係なプロセスの制御を取得し、そのトレー
                   スを開始します。トレースされるプロセスからの協力は必要とし
                   ません。このケースでは、 pid にトレースされるプロセスのプロ
                   セス ID を指定し、他の 2 つの引数は無視されます。この要求で
                   は、ターゲットプロセスがトレースするプロセスと同じ実 UID を
                   持つこと、それが setuid または setgid された実行可能モジュ
                   ールでないことが要求されます (トレースするプロセスが root
                   として実行されている場合、これらの制約は適用されません)。ト
                   レースするプロセスは、新たにトレースされるプロセスを停止さ
                   せ、あたかも最初からずっとトレースしていたかのように制御で
                   きます。

     PT_DETACH     この要求は PT_CONTINUE と類似していますが、実行を継続する別
                   の場所を指定できないこと、および要求が成功した後、トレース
                   されていたプロセスはもはやトレースされず、通常どおり実行を
                   継続することが異なります。

     さらにマシンに固有の要求が存在することがあります。i386 では、これらは次の
     とおりです。

     PT_GETREGS    この要求は、トレースされるプロセスのマシンレジスタを、 addr
                   が指す ``struct reg'' (<machine/reg.h> 内に定義されていま
                   す) 内に読み取ります。

     PT_SETREGS    この要求は PT_GETREGS の逆です。 addr が指す ``struct reg''
                   (<machine/reg.h> 内に定義されています) からトレースされるプ
                   ロセスのマシンレジスタをロードします。

     PT_GETFPREGS  この要求はトレースされるプロセスの浮動小数点レジスタを addr
                   が指す ``struct fpreg'' (<machine/reg.h> に定義されていま
                   す) に読み取ります。

     PT_SETFPREGS  この要求は PT_GETFPREGS の反対です。 addr が指す ``struct
                   fpreg'' (<machine/reg.h> 内に定義されています) からトレース
                   されるプロセスの浮動小数点レジスタをロードします。

     PT_GETDBREGS  この要求はトレースされるプロセスのデバッグレジスタを addr
                   が指す ``struct dbreg'' (<machine/reg.h> 内に定義されていま
                        o   指定されたプロセス ID を持つプロセスが存在しませ
                            ん。

     [EINVAL]
                        o   プロセスが自分自身に対して PT_ATTACH を使おうとし
                            ました。
                        o   request が正しい要求の 1 つではありませんでした。
                        o   PT_READ_U または PT_WRITE_U への addrint 境界
                            に調節されていませんでした。
                        o   PT_CONTINUE へのシグナル番号 (data) が 0 でない
                            か、または正しいシグナル番号ではありませんでした。
                        o   PT_GETREGS, PT_SETREGS, PT_GETFPREGS,
                            PT_SETFPREGS, PT_GETDBREGS または PT_SETDBREGS
                            が、有効なレジスタセットを設定せずに使用されました
                            (これが真になるのは、通常、システムプロセスについ
                            てのみです)。

     [EBUSY]
                        o   PT_ATTACH が既にトレース中のプロセスについて使用さ
                            れました。
                        o   要求をしているプロセス以外のプロセスによって、トレ
                            ースされるプロセスを操作しようとする要求が試みられ
                            ました。
                        o   要求 (PT_ATTACH 以外の) が停止されていないプロセス
                            を指定しました。

     [EPERM]
                        o   要求 (PT_ATTACH 以外の) が、まったくトレースされて
                            いないプロセスを操作しようとしました。
                        o   前述の PT_ATTACH で説明した条件を満たさないプロセ
                            スについて PT_ATTACH を使おうとしました。


関連項目

     execve(2), sigaction(2), wait(2), execv(3), i386_clr_watch(3),
     i386_set_watch(3)


歴史

     ptrace() 関数は Version 7 AT&T UNIX で登場しました。

FreeBSD 4.4                    January 20, 1996                    FreeBSD 4.4

ABELNET VPSサービス