1 .\" Hey Emacs! This file is -*- nroff -*- source.
3 .\" Copyright (c) 1993 Michael Haardt
4 .\" (michael@moria.de),
5 .\" Fri Apr 2 11:32:09 MET DST 1993
7 .\" changes Copyright 1999 Mike Coleman (mkc@acm.org)
8 .\" -- major revision to fully document ptrace semantics per recent Linux
9 .\" kernel (2.2.10) and glibc (2.1.2)
10 .\" Sun Nov 7 03:18:35 CST 1999
12 .\" This is free documentation; you can redistribute it and/or
13 .\" modify it under the terms of the GNU General Public License as
14 .\" published by the Free Software Foundation; either version 2 of
15 .\" the License, or (at your option) any later version.
17 .\" The GNU General Public License's references to "object code"
18 .\" and "executables" are to be interpreted as the output of any
19 .\" document formatting or typesetting system, including
20 .\" intermediate and printed output.
22 .\" This manual is distributed in the hope that it will be useful,
23 .\" but WITHOUT ANY WARRANTY; without even the implied warranty of
24 .\" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
25 .\" GNU General Public License for more details.
27 .\" You should have received a copy of the GNU General Public
28 .\" License along with this manual; if not, write to the Free
29 .\" Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111,
32 .\" Modified Fri Jul 23 23:47:18 1993 by Rik Faith <faith@cs.unc.edu>
33 .\" Modified Fri Jan 31 16:46:30 1997 by Eric S. Raymond <esr@thyrsus.com>
34 .\" Modified Thu Oct 7 17:28:49 1999 by Andries Brouwer <aeb@cwi.nl>
35 .\" Modified, 27 May 2004, Michael Kerrisk <mtk.manpages@gmail.com>
36 .\" Added notes on capability requirements
38 .\" 2006-03-24, Chuck Ebbert <76306.1226@compuserve.com>
39 .\" Added PTRACE_SETOPTIONS, PTRACE_GETEVENTMSG, PTRACE_GETSIGINFO,
40 .\" PTRACE_SETSIGINFO, PTRACE_SYSEMU, PTRACE_SYSEMU_SINGLESTEP
41 .\" (Thanks to Blaisorblade, Daniel Jacobowitz and others who helped.)
43 .\" FIXME: Linux 3.1 adds PTRACE_SEIZE, PTRACE_INTERRUPT, and PTRACE_LISTEN.
45 .\" Japanese Version Copyright (c) 1997-1999 HANATAKA Shinya
46 .\" all rights reserved.
47 .\" Translated 1999-11-20, HANATAKA Shinya <hanataka@abyss.rim.or.jp>
48 .\" Updated 2003-10-11, Kentaro Shirakata <argrath@ub32.org>
49 .\" Updated 2006-07-23, Akihiro MOTOKI <amotoki@dd.iij4u.or.jp>, LDP v2.28
50 .\" Updated 2007-01-07, Akihiro MOTOKI, LDP v2.43
51 .\" Updated 2007-05-01, Akihiro MOTOKI, LDP v2.46
52 .\" Updated 2008-08-06, Akihiro MOTOKI, LDP v3.05
53 .\" Updated 2009-04-13, Akihiro MOTOKI, LDP v3.20
55 .\"WORD: child process 子プロセス
56 .\"WORD: parent process 親プロセス
57 .\"WORD: core image メモリ・イメージ
58 .\"WORD: break point ブレーク・ポイント
59 .\"WORD: single step シングル・ステップ実行
60 .\"WORD: trap flag トラップ・フラグ
63 .\"WORD: process ID プロセスID
65 .TH PTRACE 2 2009-03-30 "Linux" "Linux Programmer's Manual"
70 .B #include <sys/ptrace.h>
72 .BI "long ptrace(enum __ptrace_request " request ", pid_t " pid ", "
73 .BI " void *" addr ", void *" data );
77 システムコールは、親プロセスが、別のプロセスの実行の監視/制御を
78 行ったり、コアイメージ (core image) やレジスタの調査/変更を
81 は、主にブレークポイントによるデバッグやシステムコールのトレースを
96 トレースの実行中、子プロセスはシグナルが配送されるたびに、
97 たとえそのシグナルが無視すべきものであっても停止する
102 で通知され、停止している間に子プロセスを調べたり修正したりすることができる。
103 そして親プロセスは子プロセスの実行を再開させるが、配送された
104 シグナルを無視することもできる (あるいは代わりに別のシグナルを
109 を使用して子プロセスを終了させることもできるし、
111 を用いて通常のトレースなしのモードにして、
114 \fIrequest\fP の値がこのシステムコールの動作を決定する:
117 このプロセスが親プロセスによってトレースされることを表す。
130 新しいプログラムが実行を開始する前に制御することができる。
131 親プロセスが自プロセスをトレースするつもりがない場合には、
132 おそらくこのプロセスは本要求を行うべきではないだろう。
133 (\fIpid\fP, \fIaddr\fP, \fIdata\fP は無視される。)
135 上記の要求は子プロセスだけが行なうものである。
137 以下の要求では、\fIpid\fP で操作の対象となる
143 .BR PTRACE_PEEKTEXT ", " PTRACE_PEEKDATA
146 の位置から 1 ワードを読み出す。読み出したワードは
148 の返り値として返される。 Linux ではテキスト (text) とデータ (data) で
149 同じアドレス空間を使用するため、この 2 つの要求は現在のところ
150 同じものである。 (引き数 \fIdata\fP は無視される。)
153 .\" PTRACE_PEEKUSR in kernel source, but glibc uses PTRACE_PEEKUSER,
154 .\" and that is the name that seems common on other systems.
157 の位置から 1 ワードを読み込む。USER 領域にはそのプロセスの
158 レジスタ (registers) などの情報が保持されている
159 (\fI<sys/user.h>\fP を参照)。読み込んだワードは
162 たいていはオフセットはワード境界になければならないが、
165 (\fIdata\fP は無視される。 )
167 .BR PTRACE_POKETEXT ", " PTRACE_POKEDATA
172 の位置へコピーする。上と同様に、現在のところ二つの
176 .\" PTRACE_POKEUSR in kernel source, but glibc uses PTRACE_POKEUSER,
177 .\" and that is the name that seems common on other systems.
180 を子プロセスの USER 領域のオフセット
183 上と同様に、通常、オフセットはワード境界になければならない。
184 カーネルの完全性 (integrity) を維持するため、
185 変更内容によっては USER 領域の変更は禁止されている。
187 .BR PTRACE_GETREGS ", " PTRACE_GETFPREGS
188 それぞれ、子プロセスの汎用レジスタ、浮動小数点レジスタを親プロセスの
189 \fIdata\fP の位置にコピーする。この data の書式に関しては
190 \fI<sys/user.h>\fP を参照すること。(\fIaddr\fP は無視される。)
192 .BR PTRACE_GETSIGINFO " (Linux 2.3.99-pre6 以降)"
193 停止の原因となったシグナルに関する情報を取得する。
196 参照) を子プロセスから親プロセスの \fIdata\fP の位置にコピーする。
199 .BR PTRACE_SETREGS ", " PTRACE_SETFPREGS
200 それぞれ、子プロセスの汎用レジスタ、浮動小数点レジスタに
201 親プロセスの \fIdate\fP の位置からコピーする。
204 変更が禁止されている場合がある。 (\fIaddr\fP は無視される。)
206 .BR PTRACE_SETSIGINFO " (Linux 2.3.99-pre6 以降)"
208 \fIsiginfo_t\fP 構造体を親プロセスのデータ \fIdata\fP の位置から
210 この処理を行うことができるのは、子プロセスに通常は配送されるはずで
211 トレーサに捕捉されたシグナルについてだけである。
214 自身が発生するシグナルを見分けるのは難しいかもしれない。
217 .BR PTRACE_SETOPTIONS " (Linux 2.4.6 以降; バグの章にある警告も参照)"
218 親プロセスの \fIdata\fP に基づいて ptrace のオプションを設定する
220 \fIdata\fP はオプションのビットマスクとして解釈され、
224 .BR PTRACE_O_TRACESYSGOOD " (Linux 2.4.6 以降)"
225 システムコールのトラップが配送されたときに、シグナル番号のビット 7
226 を設定する (すなわち、\fISIGTRAP | 0x80\fP を配送する)。
227 これにより、トレーサが通常のトラップとシステムコールによるトラップを
229 .RB ( PTRACE_O_TRACESYSGOOD
230 はどのアーキテクチャでも動作しない可能性がある。)
232 .BR PTRACE_O_TRACEFORK " (Linux 2.5.46 以降)"
235 呼び出し時に \fISIGTRAP | PTRACE_EVENT_FORK\ <<\ 8\fP で
237 新たに fork されたプロセスのトレースを自動的に開始し、
241 .B PTRACE_GETEVENTMSG
244 .BR PTRACE_O_TRACEVFORK " (Linux 2.5.46 以降)"
247 呼び出し時に \fISIGTRAP | PTRACE_EVENT_VFORK\ <<\ 8\fP で
249 新たに vfork されたプロセスのトレースを自動的に開始し、
253 .B PTRACE_GETEVENTMSG
256 .BR PTRACE_O_TRACECLONE " (Linux 2.5.46 以降)"
259 呼び出し時に \fISIGTRAP | PTRACE_EVENT_CLONE\ << \8\fP で
261 新たに clone で作成されたプロセスのトレースを自動的に開始し、
265 .B PTRACE_GETEVENTMSG
275 .B PTRACE_O_TRACEVFORK
277 .B PTRACE_EVENT_VFORK
284 .B PTRACE_O_TRACEFORK
289 .BR PTRACE_O_TRACEEXEC " (Linux 2.5.46 以降)"
293 \fISIGTRAP | PTRACE_EVENT_EXEC\ <<\ 8\fP
296 .BR PTRACE_O_TRACEVFORKDONE " (Linux 2.5.60 以降)"
300 \fISIGTRAP | PTRACE_EVENT_VFORK_DONE\ <<\ 8\fP
303 .BR PTRACE_O_TRACEEXIT " (Linux 2.5.60 以降)"
304 終了 (exit) 時に \fISIGTRAP | PTRACE_EVENT_EXIT\ <<\ 8\fP
305 で子プロセスの動作を停止させる。子プロセスの終了ステータスは
306 .B PTRACE_GETEVENTMSG
308 この停止はレジスタがまだ参照可能であるプロセス終了処理の初期に行われ、
309 トレーサはどこで終了が発生したかを知ることができる。
310 通常の終了通知 (exit notification) はプロセスの終了処理が完了した後に
311 行われる。コンテキストを参照することはできるにも関わらず、
312 トレーサはこの時点から終了を止めることはできない。
315 .BR PTRACE_GETEVENTMSG " (Linux 2.5.46 以降)"
316 発生したばかりの ptrace イベントに関するメッセージを
317 .RI ( "unsigned long"
319 取得したメッセージは親プロセスの \fIdata\fP の位置に格納される。
322 の場合は子プロセスの終了ステータスであり、
323 .BR PTRACE_EVENT_FORK ,
324 .BR PTRACE_EVENT_VFORK ,
325 .B PTRACE_EVENT_CLONE
326 の場合は新しいプロセスの PID である。
327 Linux 2.6.18 以降では、新しいプロセスの PID は
328 .B PTRACE_EVENT_VFORK_DONE
337 子プロセスに配送されるシグナルと解釈される。
342 子プロセスに送られたシグナルを実際に配送するかどうかを
343 制御することができる。(\fIaddr\fP は無視される。)
345 .BR PTRACE_SYSCALL ", " PTRACE_SINGLESTEP
347 と同様に停止した子プロセスを再開する。ただし、
350 次にシステムコールに入るかシステムコールから抜けるかする時に、
352 の場合は 1 命令 (instruction) 実行した後に停止させる
353 (通常どおり、子プロセスはシグナルを受け取った場合にも停止する)。
356 を受信して停止したように見える。そのため、例えば
360 を実行し、 2回目の停止でシステムコールの返り値を調べる、
369 .BR PTRACE_SYSEMU ", " PTRACE_SYSEMU_SINGLESTEP " (Linux 2.6.14 以降)"
371 は、実行を再開し、次のシステムコールに入る時に停止させる。
373 .B PTRACE_SYSEMU_SINGLESTEP
375 1 命令 (singlestep) だけ実行した時点でも停止させる。
376 このコールは User Mode Linux のように子プロセスのシステムコールを全て
377 エミュレートしようとするプログラムで使用される。
384 全てのアーキテクチャでサポートされているわけではない。)
389 を送り終了させる。(\fIaddr\fP と \fIdata\fP は無視される。)
393 で指定されたプロセスに接続 (attach) し、それを呼び出し元のプロセスの
394 子プロセスとしてトレースできるようにする。子プロセスは
396 したかのように振舞う。呼び出し元のプロセスはそのほとんどの目的において、
397 その子プロセスの実際の親になる (例えば、子プロセスのイベントの
400 で親として表示されたりする)。しかし、子プロセスで
402 を実行した場合には元の親プロセスの PID が返される。
405 が送られるが、この呼び出しが完了するまでに
406 必ずしも停止するとは限らない。子プロセスの停止を待つには
408 を使用すること。(\fIaddr\fP と \fIdata\fP は無視される。)
412 と同様に停止した子プロセスを再開する。ただし
413 まずそのプロセスからの分離 (detach) を行い、
417 の効果を取り消す。意図したものではないだろうが、
418 Linux では、トレースされている子プロセスはどのような方法でトレースを
419 開始されたとしても、この方法で分離 (detach) することができる。
430 が成功して返す値も \-1 になることがあるため、
433 を調べ、エラーか発生したのかどうかを判断しなければならない。
437 (i386 のみ) デバッグレジスタの確保または解放でエラーが発生した。
440 親プロセスまたは子プロセスのメモリの不正な領域に読み書きしようとした。
441 おそらくその領域がマッピングされていないか、
442 その領域へのアクセスが許されていないかである。
443 不運なことに、Linux ではこのようなエラーの場合、多かれ少なかれ
454 \fIrequest\fP が不正である。
455 または、親プロセスまたは子プロセスのメモリの
458 または、実行再開の要求で不正なシグナルを指定した。
461 指定したプロセスをトレースすることができない。これは親プロセスが
466 非特権プロセスはシグナルを送ることができないプロセスをトレースできないし、
467 set-user-ID/set-group-ID プログラムを実行しているプロセスはトレースできない。
468 または、プロセスはすでにトレース中である、
475 または、指定したプロセスは呼び出したプロセスが
477 または、指定したプロセスが停止していない (停止していることが必要な要求の場合)。
482 の引き数は上のようなプロトタイプに基づいて解釈されるが、
485 は \fIrequest\fP 引き数だけが固定の可変長引き数関数として
487 これは必要なければ残りの引き数は省略可能であることを意味するが、
490 の明文化されていない動作を利用していることになる。
493 すなわち PID が 1 のプロセスはトレースすることができない。
495 メモリや USER 領域の内容や配置は OS ごと、アーキテクチャごとに
497 オフセットが指定された場合、返されるデータは
500 .\" http://lkml.org/lkml/2008/5/8/375 参照。
502 「ワード (word) 」の大きさは OS によって決まる。
503 (例えば、32 ビットの Linux では 32 ビットである、など。)
505 トレースすることによってトレースされるプロセスの動作に些細な違いが
508 によって接続された場合には、そのプロセスが停止した時でも本来の親は
510 を使って通知を受けることができず、新しい親が効率よく
516 子プロセスは通常通りのシグナル配送が行われる状態にない。
519 .BR ptrace (PTRACE_CONT)
521 .BR ptrace (PTRACE_KILL)
523 こららのメッセージの受信後は、子プロセスを終了 (kill) するのに、
530 このマニュアルは現在の Linux における
532 コールの動作について記述している。他の UNIX では
536 を使うと OS やアーキテクチャに非常に依存したものになる。
540 は「独特で不可解」と記述されており、まさしくそうである。
541 Solaris 2 では proc ベースの
544 の上位互換関数が実装され、より強力で一貫性のあるものとなっている。
546 カーネル 2.6 のヘッダがインストールされたホストでは、
548 はカーネル 2.4 のヘッダとは異なる値で宣言される。
549 このため、カーネル 2.6 のヘッダでコンパイルされたアプリケーションは
556 .B PTRACE_OLDSETOPTIONS