FreeBSD 日本語マニュアル検索 (jman/japropos/jwhatis)


日本語 man コマンド類 (ja-man-1.1j_5) と日本語 man ドキュメント (ja-man-doc-5.4 (5.4-RELEASE 用) など) をインストールすると、以下のような man コマンド閲覧、キーワード検索が コンソールからできるようになります。

4.11-RELEASE-K, 5.4-RELEASE-K, 5.5-RELEASE-K, 6.0-RELEASE-K から 6.4-RELEASE-K, 7.0-RELEASE-K から 7.4-RELEASE-K, 8.0-RELEASE-K から 8.4-RELEASE-K, 9.0-RELEASE-K から 9.3-RELEASE-K, 10.0-RELEASE-K から 10.3-RELEASE-K, 11.0-RELEASE-K から 11.4-RELEASE-K, 12.0-RELEASE-K, 12.1-RELEASE-K は、 プライベート版 (小金丸が編集してまとめたもの) ですが、 より多くの翻訳したファイルが含まれています。 (5.4-RELEASE-K から 6.4-RELEASE-K, 7.0-RELEASE-K から 7.4-RELEASE-K, 8.0-RELEASE-K から 8.4-RELEASE-K, 9.0-RELEASE-K から 9.3-RELEASE-K, 10.0-RELEASE-K から 10.3-RELEASE-K, 11.0-RELEASE-K から 11.4-RELEASE-K, 12.0-RELEASE-K から 12.4-RELEASE-K, 13.0-RELEASE-K から 13.3-RELEASE-K, 14.0-RELEASE-K から 14.1-RELEASE-K は、全翻訳済み)

13.3-STABLE-K, 15.0-CURRENT-K は現在、作成中で日々更新されています。



検索コマンド: man apropos whatis
コマンド/キーワード:
日本語マニュアル RELEASE :
セクション:
Table of Contents
名称 | ライブラリ | 書式 | 解説 | ARM マシン特有の要求 | x86 マシン特有の要求 | PowerPC マシン特有の要求 | 戻り値 | エラー | 関連項目 | 歴史
PTRACE(2)              FreeBSD システムコールマニュアル              PTRACE(2)

名称
     ptrace -- プロセスのトレースとデバッグ

ライブラリ
     標準 C ライブラリ (libc, -lc)

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

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

解説
     ptrace() システムコールは、トレースとデバッグ機能を提供します。それによっ
     て、1 つのプロセス (トレースしているプロセス) は、別の (トレースされたプ
     ロセス) を制御することができます。トレースしているプロセスは、最初にト
     レースされたプロセスにアタッチしなければならず、次に、プロセスメモリとレ
     ジスタ状態のアクセスと同様に、プロセスの実行を制御するために、一連の
     ptrace() システムコールを発行します。トレースしているセッションの期間中
     に、トレースされたプロセスは、トレースしているプロセスに変更されたその親
     のプロセス ID (と、結果の振る舞い) で ``再び親と'' されます。一度に複数の
     他のプロセスにアタッチするトレースしているプロセスを許可します。トレース
     しているプロセスがその作業を完了したとき、トレースされたプロセスをデタッ
     チしなければなりません。トレースしているプロセスが最初にアタッチされてい
     たすべてのプロセスをデタッチせずに終了するなら、それらのプロセスは、kill
     されます。

     ほとんどの場合に、トレースされるプロセスは、正常に実行しますが、シグナル
     (sigaction(2) を参照) を受信するとき、停止します。トレースしているプロセ
     スは、wait(2) または SIGCHLD シグナルの配信を通してこれを通知することが期
     待され、停止されたプロセスの状態を調べ、必要に応じて、終了するか、または
     継続します。シグナルは、正常なプロセスシグナルであり、トレースされるプロ
     セスの振る舞いの結果として、または kill(2) システムコールの使用として生成
     されます。代わりに、それは、トレースしているプロセス、またはトレースされ
     るプロセスのイベントによってステップ実行され、アタッチの結果としてトレー
     スしている機能によって生成できます。トレースしているプロセスは、(SIGTRAP
     のような) プロセスの振る舞いを観察するか、または適切であるなら、シグナル
     をプロセスに転送するために、それを使用して、シグナルをインターセプトする
     かを選択します。ptrace() システムコールは、すべてのこれが起こるメカニズム
     です。

     トレースされるプロセスは、トレースされるプロセスのイベントに対応して追加
     のシグナルの停止を報告します。これらの追加のシグナルの停止は、SIGTRAP ま
     たは SIGSTOP シグナルとして報告されます。トレースしているプロセスは、どの
     イベントが SIGTRAP または SIGSTOP シグナルと関連するかを決定するために
     PT_LWPINFO 要求を使用することができます。複数のイベントは、単一のシグナル
     と関連されることに注意してください。例えば、PL_FLAG_BORN, PL_FLAG_FORKED
     と PL_FLAG_EXEC フラグによって示されるイベントは、また、システムコールの
     終了イベント (PL_FLAG_SCX) として報告されます。PTRACE_FORK を通して有効に
     された新しい子プロセスのためのシグナルの停止は、SIGSTOP シグナルを報告し
     ます。すべての他の追加のシグナルの停止は、SIGTRAP を使用します。

     各トレースされるプロセスには、トレースしているイベントマスクがあります。
     トレースされるプロセスのイベントは、対応しているフラグが、トレースしてい
     るイベントマスクに設定されるなら、シグナルの停止のみを報告します。トレー
     スしているイベントフラグの現在のセットは、次を含んでいます:

     PTRACE_EXEC        execve(2) の成功した呼び出しのための停止を報告します。
                        このイベントは、struct ptrace_lwpinfopl_flags メン
                        バの PL_FLAG_EXEC フラグによって示されます。

     PTRACE_SCE         各システムコールのエントリで停止を報告します。このイベ
                        ントは、struct ptrace_lwpinfopl_flags メンバの
                        PL_FLAG_SCE フラグによって示されます。

     PTRACE_SCX         各システムコールの終了で停止を報告します。このイベント
                        は、struct ptrace_lwpinfopl_flags メンバの
                        PL_FLAG_SCX フラグによって示されます。

     PTRACE_SYSCALL     システムコールのエントリと終了の両方のための停止を報告
                        します。

     PTRACE_FORK        このイベントフラグは、トレースされるプロセスの新しい子
                        プロセスのためのトレースを制御します。

                        このイベントフラグが有効にされるとき、新しい子プロセス
                        は、トレースすることを有効にし、それらの最初の命令を実
                        行する前に停止します。新しい子プロセスは、struct
                        ptrace_lwpinfopl_flags メンバの PL_FLAG_CHILD フラ
                        グを含めます。トレースされるプロセスは、PL_FLAG_FORKED
                        フラグを含む停止を報告します。また、新しい子プロセスの
                        プロセス ID は、struct ptrace_lwpinfopl_child_pid
                        メンバに存在します。新しい子プロセスが vfork(2) によっ
                        て作成されたなら、トレースされるプロセスの停止は、
                        PL_FLAG_VFORKED フラグも含みます。新しい子プロセスは、
                        デフォルトのトレースしているイベントマスクでアタッチさ
                        れることに注意してください。それらは、トレースされるプ
                        ロセスのイベントマスクを継承しません。

                        このイベントフラグが有効にされないとき、新しい子プロセ
                        スは、有効にされたトレースなしで実行します。

     PTRACE_LWP         このイベントフラグは、LWP (kernel thread) (カーネルス
                        レッド) の作成と破壊のトレースを制御します。このイベン
                        トが有効にされるとき、新しい LWP は、それらの最初の命
                        令を実行する前に設定される PL_FLAG_BORN でイベントを停
                        止して報告し、LWP を終了することは、それらの終了を完了
                        する前に設定される PL_FLAG_EXITED でイベントを停止して
                        報告します。

                        新しいプロセスがそれらの初期のスレッドの作成のためのイ
                        ベントを報告せず、終了プロセスは、最後のスレッドの終了
                        のためのイベントを報告しないことに注意してください。

     PTRACE_VFORK       vfork(2) の後に親プロセスが再開するとき、停止イベント
                        を報告します。

                        トレースされるプロセスのスレッドが vfork(2) によって新
                        しい供プロセスを作成するとき、PL_FLAG_FORKED と
                        PL_FLAG_SCX 報告する停止は、子プロセスが作成された直後
                        に起こりますが、スレッドが共有しているプロセスのメモリ
                        を停止するために子プロセスをウェートする前です。デバッ
                        ガが新しい子プロセスをトレースしていないなら、それは、
                        ブレークポイントが、新しい子プロセスからデタッチする前
                        に、共有されたプロセスのメモリで有効にされないことを保
                        証しなければなりません。これは、ブレークポイントがいず
                        れかの親プロセスで有効にされないことを意味しています。

                        PTRACE_VFORK フラグは、新しい子プロセスが、親プロセス
                        のプロセスのメモリを共有するのを停止するとき、示す新し
                        い停止を有効にします。デバッガは、親プロセスにブレーク
                        ポイントを再挿入することができ、このイベントに応答でそ
                        れを再開することができます。このイベントは、
                        PL_FLAG_VFORK_DONE フラグを設定することによって示され
                        ます。

     デフォルトのトレースしているイベントマスクは、PT_ATTACH, PT_TRACE_ME また
     は PTRACE_FORK によってプロセスにアタッチするとき、PTRACE_EXEC イベントだ
     けを含みます。すべての他のイベントフラグは、無効にされます。

     request 引数は、どのような操作が実行されているかを指定します。引数の残り
     の意味は、操作に依存しますが、下記に注意される 1 つの特別な場合を除いて、
     すべての ptrace() 呼び出しは、トレースしているプロセスによって行われ、pid
     引数は、トレースされるプロセスまたは対応しているスレッド ID のプロセス ID
     を指定します。request 引数は、次を指定できます:

     PT_TRACE_ME           この要求は、トレースされたプロセスによって使用され
                           る唯一のものです。それは、プロセスが、その親によっ
                           てトレースされることを期待すると宣言します。すべて
                           の他の引数は、無視されます。(親プロセスが、子プロセ
                           スをトレースすることを期待しないなら、それは、おそ
                           らく、結果によってかなり混同されます。いったんト
                           レースされたプロセスが停止すると、それは、ptrace()
                           を経ることを除いて継続することができません。) プロ
                           セスが、この要求と execve(2) を呼び出し、または
                           (execv(3) のような) それで、構築されたルーチンのい
                           ずれかを使用するとき、それは、新しいイメージの最初
                           の命令を実行する前に停止します。また、実行されてい
                           る実行形式であらゆる setuid または setgid ビットが
                           無視されます。子プロセスが vfork(2) システムコール
                           または指定された RFMEM フラグを付けた rfork(2) 呼び
                           出しによって作成されるなら、デバッグイベントは、
                           execve(2) が実行された後だけ、親プロセスに報告され
                           ます。

     PT_READ_I, PT_READ_D  これらの要求は、トレースされるプロセスのアドレス空
                           間から単一の 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_IO                 この要求によって、トレースされたプロセスのアドレス
                           空間の任意の量のデータを読み込み書き込むすることが
                           できます。addr 引数は、次のように定義されている
                           struct ptrace_io_desc へのポインタを指定します:

                           struct ptrace_io_desc {
                                   int     piod_op;        /* I/O 操作 */
                                   void    *piod_offs;     /* 子オフセット */
                                   void    *piod_addr;     /* 親オフセット */
                                   size_t  piod_len;       /* 要求の長さ */
                           };

                           /*
                            * piod_op の操作
                            */
                           #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 引
                           数は、実行が再開される場所を指定するアドレス (プロ
                           グラムカウンタのための新しい値)、または実行が中断し
                           たところからまた始めることを示す (caddr_t)1 です。
                           data 引数は、実行を再開するようにトレースされたプロ
                           セスに配信されるシグナル番号を与えるか、またはシグ
                           ナルを送られないなら、0 です。

     PT_STEP               トレースされたプロセスは、1 命令ごとに 1 ステップ実
                           行されます。addr 引数は、(caddr_t)1 が渡されるべき
                           です。data 引数は、実行を再開するようにトレースされ
                           たプロセスに配信されるシグナル番号を与えるか、また
                           はシグナルを送られないなら、0 です。

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

     PT_ATTACH             この要求によって、プロセスは、ほかの関係のないプロ
                           セスの制御を得ることができ、それをトレースすること
                           を始めます。トレースされるプロセスからなんの協力も
                           必要としません。この場合に、pid は、トレースされる
                           プロセスのプロセス ID を指定し、他の 2 回の引数は、
                           無視されます。この要求は、ターゲットプロセスに、ト
                           レースしているプロセスと同じ実 UID がなければなら
                           ず、それが、setuid または setgid の実行形式を実行し
                           てはならないことを必要とします。(トレースしているプ
                           ロセスが root として実行されているなら、これらの制
                           限は、適用されません。) トレースしているプロセス
                           は、新しくトレースされるプロセスが停止するのを調
                           べ、次に、あたかもそれが最初からずっとトレースされ
                           ていたかのように、制御します。

     PT_DETACH             この要求は、実行を続けるために代替の場所を指定する
                           ことを許可せず、それが成功した後に、トレースされる
                           プロセスが、もはやトレースされず、実行を正常に続け
                           ることを除いて、PT_CONTINUE に似ています。

     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> で定義される) に、トレースされるプ
                           ロセスのデバッグレジスタを読み込みます。

     PT_SETDBREGS          この要求は、PT_GETDBREGS の逆です。それは、addr に
                           よって指された ``struct dbreg'' (<machine/reg.h> で
                           定義される) からトレースされるプロセスのデバッグレ
                           ジスタをロードします。

     PT_LWPINFO            この要求は、トレースされるプロセスを停止する、ライ
                           トウェート (light-weight) プロセスとしての知られて
                           いる、カーネルスレッドに関する情報を取得するために
                           使用することができます。addr 引数は、次のように定義
                           される struct ptrace_lwpinfo へのポインタを指定しま
                           す:

                           struct ptrace_lwpinfo {
                                   lwpid_t pl_lwpid;
                                   int     pl_event;
                                   int     pl_flags;
                                   sigset_t pl_sigmask;
                                   sigset_t pl_siglist;
                                   siginfo_t pl_siginfo;
                                   char    pl_tdname[MAXCOMLEN + 1];
                                   pid_t   pl_child_pid;
                                   u_int   pl_syscall_code;
                                   u_int   pl_syscall_narg;
                           };

                           data 引数は、呼び出し側に知られている構造体のサイズ
                           に設定されます。これによって、構造体は、より古いプ
                           ログラムに影響せずに大きくすることができます。

                           struct ptrace_lwpinfo のフィールドには、次の意味が
                           あります:
                           pl_lwpid
                                   スレッドの LWP ID
                           pl_event
                                   停止を引き起こしたイベント。現在定義された
                                   イベントは、次の通りです:
                                   PL_EVENT_NONE       与える理由なし
                                   PL_EVENT_SIGNAL     スレッドは、保留中
                                                       (pending) のシグナルの
                                                       ために停止しました
                           pl_flags
                                   観測される停止に関する追加の詳細を指定する
                                   フラグ。現在定義されたフラグは、次の通りで
                                   す:
                                   PL_FLAG_SCE
                                           スレッドは、カーネルに入れられた直
                                           後に、システムコールのエントリのた
                                           めに停止しました。デバッガは、現在
                                           のプロセスの ABI にしたがってメモリ
                                           とレジスタに格納される syscall 引数
                                           を調べて、必要なら、それらを変更し
                                           ます。
                                   PL_FLAG_SCX
                                           スレッドは、syscall がユーザモード
                                           に戻る直前に停止されました。デバッ
                                           ガは、ABI 定義のレジスタおよびメモ
                                           リのシステムコールリターン値を調べ
                                           るかもしれません。
                                   PL_FLAG_EXEC
                                           PL_FLAG_SCX が設定されるとき、プロ
                                           グラムが execve(2) ファミリからシス
                                           テムコールの実行が成功することに
                                           よって変更された debuggee プロセス
                                           によって実行されていることを知らせ
                                           るために、このフラグを、さらに指定
                                           します。
                                   PL_FLAG_SI
                                           struct ptrace_lwpinfopl_siginfo
                                           メンバが有効な情報を含むことを示し
                                           ます。
                                   PL_FLAG_FORKED
                                           プロセスが、新しい子プロセスを作成
                                           した fork(2) への呼び出しから戻って
                                           いることを示します。新しいロセスの
                                           プロセス識別子は、struct
                                           ptrace_lwpinfopl_child_pid メン
                                           バで利用可能です。
                                   PL_FLAG_CHILD
                                           フラグは、PTRACE_FORK が有効にされ
                                           るとき、自動的にアタッチされる新し
                                           い子プロセスから報告される最初のイ
                                           ベントのために設定されます。
                                   PL_FLAG_BORN
                                           このフラグは、PTRACE_LWP が有効にさ
                                           れるとき、新しい LWP から報告される
                                           最初のイベントのために設定されま
                                           す。それは、PL_FLAG_SCX とともに報
                                           告されます。
                                   PL_FLAG_EXITED
                                           このフラグは、PTRACE_LWP が有効にさ
                                           れるとき、LWP を終了することによっ
                                           て報告された最後のイベントのために
                                           設定されます。このイベントは、プロ
                                           セスの最後の LWP が終了するとき、報
                                           告されないことに注意してください。
                                           最後のスレッドの終了は、通常のプロ
                                           セス終了イベントを通して報告されま
                                           す。
                                   PL_FLAG_VFORKED
                                           スレッドが、新しい子プロセスを作成
                                           する vfork(2) への呼び出しから返る
                                           ことを示します。このフラグは、
                                           PL_FLAG_FORKED に加えて設定されま
                                           す。
                                   PL_FLAG_VFORK_DONE
                                           vfork(2) によって作成された子プロセ
                                           スが、トレースされるプロセスでその
                                           アドレス空間を共有することを停止し
                                           た後に、スレッドが再開したことを示
                                           します。
                           pl_sigmask
                                   LWP の現在のシグナルマスク
                           pl_siglist
                                   LWP のための現在保留中のセットのシグナル。
                                   プロセスに配信されるシグナルは、スレッドが
                                   配信のために選択されるまで、LWP siglist に
                                   現れないことに注意してください。
                           pl_siginfo
                                   保留中のシグナルに伴う siginfo。PL_FLAG_SI
                                   が pl_flags に設定されているとき、
                                   PL_EVENT_SIGNAL 停止のためだけに有効です。
                           pl_tdname
                                   スレッドの名前。
                           pl_child_pid
                                   新しい子プロセスのプロセス識別子。
                                   PL_FLAG_FORKED が pl_flags に設定されている
                                   とき、PL_EVENT_SIGNAL 停止のためだけに有効
                                   です。
                           pl_syscall_code
                                   現在のシステムコールの ABI 特有の識別子。間
                                   接的なシステムコールのために、このフィール
                                   ドは、間接的なシステムコールを報告すること
                                   に注意してください。PL_FLAG_SCE または
                                   PL_FLAG_SCX が pl_flags に設定されるときの
                                   み有効です。
                           pl_syscall_narg
                                   システムコールの識別子をカウントしない現在
                                   のシステムコールに渡される引数の数。間接的
                                   なシステムコールのために、このフィールド
                                   は、間接的なシステムコールの渡される引数を
                                   報告することに注意してください。PL_FLAG_SCE
                                   または PL_FLAG_SCX が pl_flags に設定される
                                   ときのみ有効です。

     PT_GETNUMLWPS         この要求は、トレースされたプロセスに関連している
                           カーネルスレッドの数を返します。

     PT_GETLWPLIST         現在のスレッドのリストを取得するために、この要求を
                           使用することができます。タイプ lwpid_t の配列へのポ
                           インタは、data によって指定された配列サイズがある
                           addr で渡されるべきです。ptrace() からの返り値は、
                           書き込まれた配列エントリの数です。

     PT_SETSTEP            この要求は、指定されたプロセスの単一ステップ動作を
                           オンにします。ステッピングは、シングルステップのト
                           ラップが捕獲されるとき、自動的に無効にされます。

     PT_CLEARSTEP          この要求は、指定されたプロセスの単一ステップ動作を
                           オフにします。

     PT_SUSPEND            この要求は、指定されたスレッドをサスペンドします。

     PT_RESUME             この要求は、指定されたスレッドを再開します。

     PT_TO_SCE             この要求は、すべての将来のシステムコールの入口をト
                           レースし、プロセスを続けるために、PTRACE_SCE イベン
                           トフラグを設定します。addrdata 引数は、
                           PT_CONTINUE と同じように使用されます。

     PT_TO_SCX             この要求は、すべての将来のシステムコールの入口をト
                           レースし、プロセスを続けるために PTRACE_SCX イベン
                           トフラグを設定します。addrdata 引数は、
                           PT_CONTINUE と同じように使用されます。

     PT_SYSCALL            この要求は、すべての将来のシステムコールの入口と出
                           口をトレースし、プロセスを続けるために
                           PTRACE_SYSCALL イベントフラグを設定します。addrdata 引数は、PT_CONTINUE と同じように使用されます。

     PT_GET_SC_ARGS        PL_FLAG_SCE または PL_FLAG_SCX 状態のいずれかで停止
                           するスレッドについて、すなわち、 syscall への入口ま
                           たは出口で、この要求は、syscall 引数を取り出しま
                           す。

                           引数は、addr ポインタによって指されたバッファに連続
                           してコピーされます。各 syscall 引数は、マシン語とし
                           て格納されます。カーネルは、syscall が受け付けるの
                           と同じくらい多くの引数としてコピーしますが、struct
                           ptrace_lwpinfopl_syscall_narg メンバを参照、合
                           計の data バイト以上は、コピーされません。

     PT_FOLLOW_FORK        この要求は、トレースされたプロセスの新しい子プロセ
                           スのトレースを制御します。data が 0 でないなら、
                           PTRACE_FORK は、トレースされるプロセスのイベントの
                           トレースマスクで設定されます。data が 0 であるな
                           ら、PTRACE_FORK は、トレースされるプロセスのイベン
                           トのトレースマスクからクリアされます。

     PT_LWP_EVENTS         この要求は、LWP の作成と破壊のトレースを制御しま
                           す。data が 0 でないなら、PTRACE_LWP は、トレースさ
                           れるプロセスのイベントのトレースマスクで設定されま
                           す。data が 0 であるなら、PTRACE_LWP は、トレースさ
                           れるプロセスのイベントのトレースマスクからクリアさ
                           れます。

     PT_GET_EVENT_MASK     この要求は、トレースされるプロセスのイベントのト
                           レースマスクを addr によって指される整数に読み込み
                           ます。整数のサイズは、data に渡されなければなりませ
                           ん。

     PT_SET_EVENT_MASK     この要求は、addr によって指される整数から、トレース
                           されるプロセスのイベントのトレースマスクを設定しま
                           す。整数のサイズは、data で渡されなければなりませ
                           ん。

     PT_VM_TIMESTAMP       この要求は、ptrace() から返り値としてトレースされた
                           プロセスのメモリマップの世代 (generation) 番号また
                           はタイムスタンプを返します。これは、VM マップが、こ
                           の要求が行われた最後の時から変更されたかどうか決定
                           するためにトレースするプロセスのための安価な方法を
                           提供しています。

     PT_VM_ENTRY           この要求は、トレースされたプロセスの VM マップのエ
                           ントリを繰り返すために使用されます。addr 引数は、次
                           の通り定義される struct ptrace_vm_entry へのポイン
                           タを指定します:

                           struct ptrace_vm_entry {
                                   int             pve_entry;
                                   int             pve_timestamp;
                                   u_long          pve_start;
                                   u_long          pve_end;
                                   u_long          pve_offset;
                                   u_int           pve_prot;
                                   u_int           pve_pathlen;
                                   long            pve_fileid;
                                   uint32_t        pve_fsid;
                                   char            *pve_path;
                           };

                           最初のエントリは、pve_entry を 0 に設定することに
                           よって返されます。それに続くエントリは、前の要求に
                           よって返された値から変更されないままの pve_entry が
                           返されます。エントリで繰り返えされている間に、VM
                           マップへの変更を検出するために pve_timestamp フィー
                           ルドを使用することができます。そして、トレースして
                           いるプロセスは、再開などのような適切なアクションを
                           取ることができます。エントリの pve_pathlen を 0 以
                           外に設定することによって、支援されたオブジェクトの
                           パス名は、vnode によって支援される提供されたエント
                           リである。pve_path によって指されたバッファに返され
                           ます。pve_pathlen フィールドは、(終端のヌル文字を含
                           んで) パス名の実際の長さに更新されます。pve_offset
                           フィールドは、範囲が始まる支援されたオブジェクト内
                           のオフセットです。範囲は、pve_start の VM 空間に位
                           置して pve_end まで広がっています (包括的)。

                           data 引数は、無視されます。

ARM マシン特有の要求
     PT_GETVFPREGS     スレッドの VFP マシン状態を addr によって指されるバッ
                       ファに返します。

                       data 引数は、無視されます。

     PT_SETVFPREGS     addr によって指されるバッファからスレッドの VFP マシン
                       状態を設定します。

                       data 引数は、無視されます。

x86 マシン特有の要求
     PT_GETXMMREGS         XMM FPU 状態を、引数 addr によって指されたバッファ
                           にコピーします。バッファは、マシン命令 FXSAVE のた
                           めの 32 ビットの保存バッファと同じレイアウトがあり
                           ます。

                           この要求は、ネイティブな 32 ビットシステムと amd64
                           カーネルの両方で i386 プログラムのためだけに有効で
                           す。64 ビットの amd64 プログラムのために、XMM 状態
                           は、PT_GETFPREGS 要求によって返された FPU 状態の一
                           部として報告されます。

                           data 引数は、無視されます。

     PT_SETXMMREGS         引数 addr によって指されたバッファからのスレッドの
                           ための XMM FPU 状態をロードします。バッファは、マシ
                           ン命令 FXRSTOR のための 32 ビットロードバッファと同
                           じレイアウトがあります。

                           PT_GETXMMREGS と同様に、この要求は、i386 プログラム
                           のためだけに有効です。

                           data 引数は、無視されます。データ引数は無視されま
                           す。

     PT_GETXSTATE_INFO     XSAVE FPU 拡張が CPU によってサポートされ、ユーザ空
                           間のプログラムで許可されることを報告します。addr 引
                           数は、返された要求の情報を含んでいる、タイプ struct
                           ptrace_xstate_info の変数を指さなければなりません。
                           struct ptrace_xstate_info は、次のように定義されま
                           す:

                           struct ptrace_xstate_info {
                                   uint64_t        xsave_mask;
                                   uint32_t        xsave_len;
                           };
                           xsave_mask フィールドは、現在有効にされた拡張のビッ
                           トマスクです。ビットの意味は、Intel と AMD プロセッ
                           サの文書に定義されています。xsave_len フィールド
                           は、x86 の XSAVE マシン命令によって定義された形式で
                           現在有効にされた拡張のためのハードウェア状態を、格
                           納するための XSAVE 領域の長さを報告します。

                           data 引数の値は、struct ptrace_xstate_info のサイズ
                           と等しくなければなりません。

     PT_GETXSTATE          スレッドのための XSAVE 領域の内容を返します。addr
                           引数は、内容がコピーされるバッファを指し、data 引数
                           は、バッファのサイズを指定します。カーネルは、バッ
                           ファサイズによって許可されるのと同じくらい多くの内
                           容をコピーします。バッファのレイアウトは、XSAVE マ
                           シン命令のための保存領域のレイアウトによって指定さ
                           れます。

     PT_SETXSTATE          addr ポインタによって指定されたバッファからスレッド
                           のための XSAVE 状態をロードします。バッファサイズ
                           は、data 引数で渡されます。バッファは、完全な x87
                           FPU と XMM 状態のロードを許可するために、少なくとも
                           (x86/fpu.h で定義される) struct savefpu と同じくら
                           い大きくなければなりません。それは、
                           PT_GETXSTATE_INFO 要求の struct ptrace_xstate_info
                           から xsave_len フィールドによって報告されるように、
                           XSAVE 状態の長さより大きくあってはなりません。バッ
                           ファのレイアウトは、XRSTOR マシン命令のためのロード
                           領域のレイアウトと同一です。

     PT_GETFSBASE          %fs セグメントレジスタを使用して、セグメント化され
                           たメモリのアドレッシングを行うとき、使用される基本
                           の値を返します。addr 引数は、基本の値が格納される
                           unsigned long の変数を指します。

                           data 引数は、無視されます。

     PT_GETGSBASE          PT_GETFSBASE 要求に似ていますが、%gs セグメントレジ
                           スタのためのベースを返します。

     PT_SETFSBASE          addr 引数によって指された値への %fs セグメントレジ
                           スタのためのベースを設定します。addr は、新しいベー
                           スを含んでいる unsigned long 変数を指さなければなり
                           ません。

                           data 引数は、無視されます。

     PT_SETGSBASE          PT_SETFSBASE 要求に似ていますが、%gs セクメントレジ
                           スタのためのベースを設定します。

PowerPC マシン特有の要求
     PT_GETVRREGS     addr によって指されたバッファにスレッドの ALTIVEC マシン
                      状態を返します。

                      data 引数は、無視されます。

     PT_SETVRREGS     addr によって指されたバッファからスレッドの ALTIVEC マシ
                      ン状態を設定します。

                      data 引数は、無視されます。

     さらに、他のマシン特有の要求が、存在します。

戻り値
     ほとんどの要求は、成功すれば、0 を返し、エラーで -1 を返します。いくつか
     の要求によって、ptrace() は、成功すれば、プロセスメモリから読み込まれた値
     を返す PT_READ_I と PT_READ_D であるので、エラーでない値として -1 を返す
     ことができます。あいまいさをなくすために、呼び出しの前に errno を 0 に設
     定して、後でチェックすることができます。

     現在の ptrace() の実装は、歴史的な理由のためと他のオペレーティングシステ
     ムとの一貫性の両方のために、カーネルへの呼び出しの前に、常に errno を 0
     に設定します。それは、前方互換性のために 0 を errno に明示的に割り当てる
     ように推奨されます。

エラー
     ptrace() システムコールは、次の場合に失敗します:

     [ESRCH]
                        •   指定されたプロセス ID があるプロセスが存在しませ
                            ん。

     [EINVAL]
                        •   プロセスがそれ自体で PT_ATTACH の使用を試みまし
                            た。
                        •   request 引数が正しい要求の 1 つではありませんでし
                            た。
                        •   PT_CONTINUE への (data の) シグナル番号が 0 でも正
                            しいシグナル番号でもありませんでした。
                        •   PT_GETREGS, PT_SETREGS, PT_GETFPREGS,
                            PT_SETFPREGS, PT_GETDBREGS または PT_SETDBREGS
                            が、有効なレジスタセットがないプロセスで試みられま
                            した。(これは、通常、システムプロセスでのみ真で
                            す)。
                        •   PT_VM_ENTRY は、pve_entry のための無効の値が与えら
                            れました。これは、また、プロセスの VM マップへの変
                            更によって引き起こされるかもしれません。
                        •   PT_LWPINFO に提供される (data の) サイズは、0 以下
                            か、またはカーネルに既知の ptrace_lwpinfo 構造体よ
                            り大きくなります。
                        •   x86 特有の PT_GETXSTATE_INFO 要求に提供された
                            (data の) サイズは、struct ptrace_xstate_info のサ
                            イズと等しくありませんでした。
                        •   x86 特有の PT_SETXSTATE 要求に提供された (data の)
                            サイズは、x87 プラス XMM 保存領域のサイズより小さ
                            かった。
                        •   x86 特有の PT_SETXSTATE 要求に提供された (data の)
                            サイズは、PT_GETXSTATE_INFO 要求から struct
                            ptrace_xstate_info の xsave_len メンバに返されたも
                            のより大きかった。
                        •   amd64 特有の要求 PT_SETFSBASE または PT_SETGSBASE
                            に提供された、基本の値は、有効なユーザアドレス空間
                            の外側を指しました。このエラーは、32 ビットプログ
                            ラムで起こりません。

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

     [EPERM]
                        •   (PT_ATTACH 以外の) 要求が、まったくトレースされて
                            いなかったプロセスを操作しようと試みました。
                        •   上記の PT_ATTACH の下でリストされた要件の違反のプ
                            ロセスで PT_ATTACH を使用するために、試みが行われ
                            ました。

     [ENOENT]
                        •   PT_VM_ENTRY は、以前に返された、メモリマップの最後
                            のエントリです。それ以上のエントリが存在していませ
                            ん。

     [ENAMETOOLONG]
                        •   PT_VM_ENTRY は、バッファが十分に大きくないので、支
                            援されたオブジェクトのパス名を返すことができませ
                            ん。pve_pathlen は、戻り時に必要であった最小のバッ
                            ファサイズを保持しています。

関連項目
     execve(2), sigaction(2), wait(2), execv(3), i386_clr_watch(3),
     i386_set_watch(3)

歴史
     ptrace() 関数は、Version 6 AT&T UNIX で登場しました。

FreeBSD 11.4                     May 22, 2018                     FreeBSD 11.4

Table of Contents

FreeBSD マニュアル検索