OSDN Git Service

(split) LDP: Release getcpu.2, migrate_pages.2, makedev.3, matherr.3.
[linuxjm/LDP_man-pages.git] / release / man2 / ptrace.2
1 .\" Hey Emacs! This file is -*- nroff -*- source.
2 .\"
3 .\" Copyright (c) 1993 Michael Haardt
4 .\" (michael@moria.de),
5 .\" Fri Apr  2 11:32:09 MET DST 1993
6 .\"
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
11 .\"
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.
16 .\"
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.
21 .\"
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.
26 .\"
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,
30 .\" USA.
31 .\"
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
37 .\"
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.)
42 .\"
43 .\" FIXME: Linux 3.1 adds PTRACE_SEIZE, PTRACE_INTERRUPT, and PTRACE_LISTEN.
44 .\"
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
54 .\"
55 .\"WORD:        child process           子プロセス
56 .\"WORD:        parent process          親プロセス
57 .\"WORD:        core image              メモリ・イメージ
58 .\"WORD:        break point             ブレーク・ポイント
59 .\"WORD:        single step             シングル・ステップ実行
60 .\"WORD:        trap flag               トラップ・フラグ
61 .\"WORD:        attach                  接続
62 .\"WORD:        detach                  分離
63 .\"WORD:        process ID              プロセスID
64 .\"
65 .TH PTRACE 2 2009-03-30 "Linux" "Linux Programmer's Manual"
66 .SH 名前
67 ptrace \- プロセスのトレース
68 .SH 書式
69 .nf
70 .B #include <sys/ptrace.h>
71 .sp
72 .BI "long ptrace(enum __ptrace_request " request ", pid_t " pid ", "
73 .BI "            void *" addr ", void *" data );
74 .fi
75 .SH 説明
76 .BR ptrace ()
77 システムコールは、親プロセスが、別のプロセスの実行の監視/制御を
78 行ったり、コアイメージ (core image) やレジスタの調査/変更を
79 行ったりする手段を提供する。
80 .BR ptrace ()
81 は、主にブレークポイントによるデバッグやシステムコールのトレースを
82 実装するのに用いられる。
83 .LP
84 トレースを開始するには、まず親プロセスで
85 .BR fork (2)
86 を呼び出す。生成された子プロセスで
87 .B PTRACE_TRACEME
88 を行い、続いて (典型的には)
89 .BR exec (3)
90 を行なう。
91 別の方法としては、
92 親プロセスが既存のプロセスに対して
93 .B PTRACE_ATTACH
94 を使用し、トレースを開始する。
95 .LP
96 トレースの実行中、子プロセスはシグナルが配送されるたびに、
97 たとえそのシグナルが無視すべきものであっても停止する
98 .RB ( SIGKILL
99 は例外で、通常どおりの効果をもたらす)。
100 親プロセスには次の
101 .BR wait (2)
102 で通知され、停止している間に子プロセスを調べたり修正したりすることができる。
103 そして親プロセスは子プロセスの実行を再開させるが、配送された
104 シグナルを無視することもできる (あるいは代わりに別のシグナルを
105 配送することもできる) 。
106 .LP
107 親プロセスがトレースを終了する際には、
108 .B PTRACE_KILL
109 を使用して子プロセスを終了させることもできるし、
110 .B PTRACE_DETACH
111 を用いて通常のトレースなしのモードにして、
112 実行を継続させることもできる。
113 .LP
114 \fIrequest\fP の値がこのシステムコールの動作を決定する:
115 .TP
116 .B PTRACE_TRACEME
117 このプロセスが親プロセスによってトレースされることを表す。
118 このプロセスに
119 .RB ( SIGKILL
120 以外の) シグナルが配送されると、
121 プロセスは停止し、親プロセスに
122 .BR wait (2)
123 を通じて通知される。
124 また、これ以降はこのプロセスが
125 .BR execve (2)
126 を呼び出す度に
127 .B SIGTRAP
128 が送信されるようになる。
129 これによって、親プロセスは
130 新しいプログラムが実行を開始する前に制御することができる。
131 親プロセスが自プロセスをトレースするつもりがない場合には、
132 おそらくこのプロセスは本要求を行うべきではないだろう。
133 (\fIpid\fP, \fIaddr\fP, \fIdata\fP は無視される。)
134 .LP
135 上記の要求は子プロセスだけが行なうものである。
136 残りは親プロセスだけが行なうものである。
137 以下の要求では、\fIpid\fP で操作の対象となる
138 子プロセスを指定する。
139 .B PTRACE_KILL
140 を除き、要求を行なうためには
141 子プロセスは停止していなければならない。
142 .TP
143 .BR PTRACE_PEEKTEXT ", " PTRACE_PEEKDATA
144 子プロセスのメモリの
145 .I addr
146 の位置から 1 ワードを読み出す。読み出したワードは
147 .BR ptrace ()
148 の返り値として返される。 Linux ではテキスト (text) とデータ (data) で
149 同じアドレス空間を使用するため、この 2 つの要求は現在のところ
150 同じものである。 (引き数 \fIdata\fP は無視される。)
151 .TP
152 .B PTRACE_PEEKUSER
153 .\" PTRACE_PEEKUSR in kernel source, but glibc uses PTRACE_PEEKUSER,
154 .\" and that is the name that seems common on other systems.
155 子プロセスの USER 領域のオフセット
156 .I addr
157 の位置から 1 ワードを読み込む。USER 領域にはそのプロセスの
158 レジスタ (registers) などの情報が保持されている
159 (\fI<sys/user.h>\fP を参照)。読み込んだワードは
160 .BR ptrace ()
161 コールの結果として返される。
162 たいていはオフセットはワード境界になければならないが、
163 アーキテクチャによってはその必要はない。
164 「注意」の節を参照。
165 (\fIdata\fP は無視される。 )
166 .TP
167 .BR PTRACE_POKETEXT ", " PTRACE_POKEDATA
168 ワード
169 .I data
170 を子プロセスのメモリの
171 .I addr
172 の位置へコピーする。上と同様に、現在のところ二つの
173 要求は同じものである。
174 .TP
175 .B PTRACE_POKEUSER
176 .\" PTRACE_POKEUSR in kernel source, but glibc uses PTRACE_POKEUSER,
177 .\" and that is the name that seems common on other systems.
178 ワード
179 .I data
180 を子プロセスの USER 領域のオフセット
181 .I addr
182 の位置にコピーする。
183 上と同様に、通常、オフセットはワード境界になければならない。
184 カーネルの完全性 (integrity) を維持するため、
185 変更内容によっては USER 領域の変更は禁止されている。
186 .TP
187 .BR PTRACE_GETREGS ", " PTRACE_GETFPREGS
188 それぞれ、子プロセスの汎用レジスタ、浮動小数点レジスタを親プロセスの
189 \fIdata\fP の位置にコピーする。この data の書式に関しては
190 \fI<sys/user.h>\fP を参照すること。(\fIaddr\fP は無視される。)
191 .TP
192 .BR PTRACE_GETSIGINFO " (Linux 2.3.99-pre6 以降)"
193 停止の原因となったシグナルに関する情報を取得する。
194 \fIsiginfo_t\fP 構造体
195 .RB ( sigaction (2)
196 参照) を子プロセスから親プロセスの \fIdata\fP の位置にコピーする。
197 (\fIaddr\fP は無視される。)
198 .TP
199 .BR PTRACE_SETREGS ", " PTRACE_SETFPREGS
200 それぞれ、子プロセスの汎用レジスタ、浮動小数点レジスタに
201 親プロセスの \fIdate\fP の位置からコピーする。
202 .B PTRACE_POKEUSER
203 と同様に、汎用レジスタによっては
204 変更が禁止されている場合がある。 (\fIaddr\fP は無視される。)
205 .TP
206 .BR PTRACE_SETSIGINFO " (Linux 2.3.99-pre6 以降)"
207 シグナル情報を設定する。
208 \fIsiginfo_t\fP 構造体を親プロセスのデータ \fIdata\fP の位置から
209 子プロセスにコピーする。
210 この処理を行うことができるのは、子プロセスに通常は配送されるはずで
211 トレーサに捕捉されたシグナルについてだけである。
212 これらの通常のシグナルと
213 .BR ptrace ()
214 自身が発生するシグナルを見分けるのは難しいかもしれない。
215 (\fIaddr\fP は無視される。)
216 .TP
217 .BR PTRACE_SETOPTIONS " (Linux 2.4.6 以降; バグの章にある警告も参照)"
218 親プロセスの \fIdata\fP に基づいて ptrace のオプションを設定する
219 (\fIaddr\fP は無視される)。
220 \fIdata\fP はオプションのビットマスクとして解釈され、
221 オプションには以下のフラグを指定できる:
222 .RS
223 .TP
224 .BR PTRACE_O_TRACESYSGOOD " (Linux 2.4.6 以降)"
225 システムコールのトラップが配送されたときに、シグナル番号のビット 7
226 を設定する (すなわち、\fISIGTRAP | 0x80\fP を配送する)。
227 これにより、トレーサが通常のトラップとシステムコールによるトラップを
228 区別しやすくなる。
229 .RB ( PTRACE_O_TRACESYSGOOD
230 はどのアーキテクチャでも動作しない可能性がある。)
231 .TP
232 .BR PTRACE_O_TRACEFORK " (Linux 2.5.46 以降)"
233 次の
234 .BR fork (2)
235 呼び出し時に \fISIGTRAP | PTRACE_EVENT_FORK\ <<\ 8\fP で
236 子プロセスの動作を停止させ、
237 新たに fork されたプロセスのトレースを自動的に開始し、
238 .B SIGSTOP
239 でそのプロセスの実行を開始する。
240 新しいプロセスの PID は
241 .B PTRACE_GETEVENTMSG
242 で取得できる。
243 .TP
244 .BR PTRACE_O_TRACEVFORK " (Linux 2.5.46 以降)"
245 次の
246 .BR vfork (2)
247 呼び出し時に \fISIGTRAP | PTRACE_EVENT_VFORK\ <<\ 8\fP で
248 子プロセスの動作を停止させ、
249 新たに vfork されたプロセスのトレースを自動的に開始し、
250 .B SIGSTOP
251 でそのプロセスの実行を開始する。
252 新しいプロセスの PID は
253 .B PTRACE_GETEVENTMSG
254 で取得できる。
255 .TP
256 .BR PTRACE_O_TRACECLONE " (Linux 2.5.46 以降)"
257 次の
258 .BR clone (2)
259 呼び出し時に \fISIGTRAP | PTRACE_EVENT_CLONE\ << \8\fP で
260 子プロセスの動作を停止させ、
261 新たに clone で作成されたプロセスのトレースを自動的に開始し、
262 .B SIGSTOP
263 でプロセスの実行を開始する。
264 新しいプロセスの PID は
265 .B PTRACE_GETEVENTMSG
266 で取得できる。
267 このオプションで全ての
268 .BR clone (2)
269 コールを捕まえられるわけではない。
270 子プロセスが
271 .B CLONE_VFORK
272 フラグ付きで
273 .BR clone (2)
274 を呼び出した場合、
275 .B PTRACE_O_TRACEVFORK
276 が設定されていれば代わりに
277 .B PTRACE_EVENT_VFORK
278 が配送される。
279 また、子プロセスが終了シグナルを
280 .B SIGCHLD
281 に設定して
282 .BR clone (2)
283 を呼び出した場合は、
284 .B PTRACE_O_TRACEFORK
285 が設定されていれば
286 .B PTRACE_EVENT_FORK
287 が配送される。
288 .TP
289 .BR PTRACE_O_TRACEEXEC " (Linux 2.5.46 以降)"
290 次の
291 .BR execve (2)
292 呼び出し時に
293 \fISIGTRAP | PTRACE_EVENT_EXEC\ <<\ 8\fP
294 で子プロセスの動作を停止させる。
295 .TP
296 .BR PTRACE_O_TRACEVFORKDONE " (Linux 2.5.60 以降)"
297 次の
298 .BR vfork (2)
299 呼び出し時に
300 \fISIGTRAP | PTRACE_EVENT_VFORK_DONE\ <<\ 8\fP
301 で子プロセスの動作を停止させる。
302 .TP
303 .BR PTRACE_O_TRACEEXIT " (Linux 2.5.60 以降)"
304 終了 (exit) 時に \fISIGTRAP | PTRACE_EVENT_EXIT\ <<\ 8\fP
305 で子プロセスの動作を停止させる。子プロセスの終了ステータスは
306 .B PTRACE_GETEVENTMSG
307 で取得できる。
308 この停止はレジスタがまだ参照可能であるプロセス終了処理の初期に行われ、
309 トレーサはどこで終了が発生したかを知ることができる。
310 通常の終了通知 (exit notification) はプロセスの終了処理が完了した後に
311 行われる。コンテキストを参照することはできるにも関わらず、
312 トレーサはこの時点から終了を止めることはできない。
313 .RE
314 .TP
315 .BR PTRACE_GETEVENTMSG " (Linux 2.5.46 以降)"
316 発生したばかりの ptrace イベントに関するメッセージを
317 .RI ( "unsigned long"
318 型で) 取得する。
319 取得したメッセージは親プロセスの \fIdata\fP の位置に格納される。
320 得られる内容は、
321 .B PTRACE_EVENT_EXIT
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
329 で入手できる。
330 (\fIaddr\fP は無視される。)
331 .TP
332 .B PTRACE_CONT
333 停止した子プロセスの実行を再開させる。
334 \fIdata\fP がゼロでなく、
335 .B SIGSTOP
336 でもなければ、
337 子プロセスに配送されるシグナルと解釈される。
338 ゼロや
339 .B SIGSTOP
340 の場合はシグナルは配送されない。
341 これを使うと、例えば、親プロセスは
342 子プロセスに送られたシグナルを実際に配送するかどうかを
343 制御することができる。(\fIaddr\fP は無視される。)
344 .TP
345 .BR PTRACE_SYSCALL ", " PTRACE_SINGLESTEP
346 .B PTRACE_CONT
347 と同様に停止した子プロセスを再開する。ただし、
348 .B PTRACE_SYSCALL
349 の場合は子プロセスが
350 次にシステムコールに入るかシステムコールから抜けるかする時に、
351 .B PTRACE_SINGLESTEP
352 の場合は 1 命令 (instruction) 実行した後に停止させる
353 (通常どおり、子プロセスはシグナルを受け取った場合にも停止する)。
354 親プロセスから見ると、子プロセスは
355 .B SIGTRAP
356 を受信して停止したように見える。そのため、例えば
357 .B PTRACE_SYSCALL
358 を使うと、1回目の停止で引き数を調べて
359 .B PTRACE_SYSCALL
360 を実行し、 2回目の停止でシステムコールの返り値を調べる、
361 というようなことができる。
362 引き数
363 .I data
364
365 .B PTRACE_CONT
366 の場合と同じ様に解釈される。
367 (\fIaddr\fP は無視される。)
368 .TP
369 .BR PTRACE_SYSEMU ", " PTRACE_SYSEMU_SINGLESTEP " (Linux 2.6.14 以降)"
370 .B PTRACE_SYSEMU
371 は、実行を再開し、次のシステムコールに入る時に停止させる。
372 システムコールは実行されない。
373 .B PTRACE_SYSEMU_SINGLESTEP
374 も同様だが、システムコールでない場合には
375 1 命令 (singlestep) だけ実行した時点でも停止させる。
376 このコールは User Mode Linux のように子プロセスのシステムコールを全て
377 エミュレートしようとするプログラムで使用される。
378 引き数
379 .I data
380
381 .B PTRACE_CONT
382 の場合と同じ様に解釈される。
383 (\fIaddr\fP は無視される。
384 全てのアーキテクチャでサポートされているわけではない。)
385 .TP
386 .B PTRACE_KILL
387 子プロセスに
388 .B SIGKILL
389 を送り終了させる。(\fIaddr\fP と \fIdata\fP は無視される。)
390 .TP
391 .B PTRACE_ATTACH
392 .I pid
393 で指定されたプロセスに接続 (attach) し、それを呼び出し元のプロセスの
394 子プロセスとしてトレースできるようにする。子プロセスは
395 .B PTRACE_TRACEME
396 したかのように振舞う。呼び出し元のプロセスはそのほとんどの目的において、
397 その子プロセスの実際の親になる (例えば、子プロセスのイベントの
398 通知を受けとったり、
399 .BR ps (1)
400 で親として表示されたりする)。しかし、子プロセスで
401 .BR getppid (2)
402 を実行した場合には元の親プロセスの PID が返される。
403 子プロセスには
404 .B SIGSTOP
405 が送られるが、この呼び出しが完了するまでに
406 必ずしも停止するとは限らない。子プロセスの停止を待つには
407 .BR wait (2)
408 を使用すること。(\fIaddr\fP と \fIdata\fP は無視される。)
409 .TP
410 .B PTRACE_DETACH
411 .B PTRACE_CONT
412 と同様に停止した子プロセスを再開する。ただし
413 まずそのプロセスからの分離 (detach) を行い、
414 .B PTRACE_ATTACH
415 での親の切り換えによる効果と
416 .B PTRACE_TRACEME
417 の効果を取り消す。意図したものではないだろうが、
418 Linux では、トレースされている子プロセスはどのような方法でトレースを
419 開始されたとしても、この方法で分離 (detach) することができる。
420 (\fIaddr\fP は無視される。)
421 .SH 返り値
422 成功すると、
423 .B PTRACE_PEEK*
424 の場合は要求したデータを返し、
425 それ以外の場合は 0 を返す。
426 エラーの場合は \-1 を返し、
427 .I errno
428 が適切に設定される。
429 .B PTRACE_PEEK*
430 が成功して返す値も \-1 になることがあるため、
431 そのような要求の場合には、呼び出し元は
432 .I errno
433 を調べ、エラーか発生したのかどうかを判断しなければならない。
434 .SH エラー
435 .TP
436 .B EBUSY
437 (i386 のみ) デバッグレジスタの確保または解放でエラーが発生した。
438 .TP
439 .B EFAULT
440 親プロセスまたは子プロセスのメモリの不正な領域に読み書きしようとした。
441 おそらくその領域がマッピングされていないか、
442 その領域へのアクセスが許されていないかである。
443 不運なことに、Linux ではこのようなエラーの場合、多かれ少なかれ
444 恣意的に
445 .B EIO
446 を返したり
447 .B EFAULT
448 を返したりすることがある。
449 .TP
450 .B EINVAL
451 不正なオプションを設定しようとした。
452 .TP
453 .B EIO
454 \fIrequest\fP が不正である。
455 または、親プロセスまたは子プロセスのメモリの
456 不正な領域に読み書きしようとした。
457 または、ワード境界違反があった。
458 または、実行再開の要求で不正なシグナルを指定した。
459 .TP
460 .B EPERM
461 指定したプロセスをトレースすることができない。これは親プロセスが
462 必要な権限 (必要なケーパビリティは
463 .BR CAP_SYS_PTRACE )
464 を持っていないことが原因の場合がある。
465 分かりやすい理由を挙げるなら、
466 非特権プロセスはシグナルを送ることができないプロセスをトレースできないし、
467 set-user-ID/set-group-ID プログラムを実行しているプロセスはトレースできない。
468 または、プロセスはすでにトレース中である、
469 または
470 .BR init (8)
471 プロセス (PID が 1) である。
472 .TP
473 .B ESRCH
474 指定したプロセスが存在しない。
475 または、指定したプロセスは呼び出したプロセスが
476 現在トレース中の子プロセスではない。
477 または、指定したプロセスが停止していない (停止していることが必要な要求の場合)。
478 .SH 準拠
479 SVr4, 4.3BSD.
480 .SH 注意
481 .BR ptrace ()
482 の引き数は上のようなプロトタイプに基づいて解釈されるが、
483 glibc では、現在のところ
484 .BR ptrace ()
485 は \fIrequest\fP 引き数だけが固定の可変長引き数関数として
486 宣言されている。
487 これは必要なければ残りの引き数は省略可能であることを意味するが、
488 それは
489 .BR gcc (1)
490 の明文化されていない動作を利用していることになる。
491 .LP
492 .BR init (8)
493 すなわち PID が 1 のプロセスはトレースすることができない。
494 .LP
495 メモリや USER 領域の内容や配置は OS ごと、アーキテクチャごとに
496 非常に依存する。
497 オフセットが指定された場合、返されるデータは
498 .I "struct user"
499 の定義と完全に一致しないこともありえる。
500 .\" http://lkml.org/lkml/2008/5/8/375 参照。
501 .LP
502 「ワード (word) 」の大きさは OS によって決まる。
503 (例えば、32 ビットの Linux では 32 ビットである、など。)
504 .LP
505 トレースすることによってトレースされるプロセスの動作に些細な違いが
506 起こることがある。例えば、プロセスが
507 .B PTRACE_ATTACH
508 によって接続された場合には、そのプロセスが停止した時でも本来の親は
509 .BR wait (2)
510 を使って通知を受けることができず、新しい親が効率よく
511 この通知を真似る方法もない。
512 .LP
513 親プロセスが
514 .B PTRACE_EVENT_*
515 がセットされたイベントを受信した場合、
516 子プロセスは通常通りのシグナル配送が行われる状態にない。
517 つまり、親プロセスが、
518 シグナルにより
519 .BR ptrace (PTRACE_CONT)
520 を行ったり、
521 .BR ptrace (PTRACE_KILL)
522 を行ったりできないということである。
523 こららのメッセージの受信後は、子プロセスを終了 (kill) するのに、
524 シグナル
525 .B SIGKILL
526 を指定して
527 .BR kill (2)
528 を行う方法を代わりに使用できる。
529 .LP
530 このマニュアルは現在の Linux における
531 .BR ptrace ()
532 コールの動作について記述している。他の UNIX では
533 その動作は著しく異なる。
534 いかなる場合も
535 .BR ptrace ()
536 を使うと OS やアーキテクチャに非常に依存したものになる。
537 .LP
538 SunOS のマニュアル・ページには
539 .BR ptrace ()
540 は「独特で不可解」と記述されており、まさしくそうである。
541 Solaris 2 では proc ベースの
542 デバッグのインターフェースとして
543 .BR ptrace ()
544 の上位互換関数が実装され、より強力で一貫性のあるものとなっている。
545 .SH バグ
546 カーネル 2.6 のヘッダがインストールされたホストでは、
547 .B PTRACE_SETOPTIONS
548 はカーネル 2.4 のヘッダとは異なる値で宣言される。
549 このため、カーネル 2.6 のヘッダでコンパイルされたアプリケーションは
550 カーネル 2.4 では正しく動作しない。
551 この問題は、
552 .B PTRACE_SETOPTIONS
553 が定義されていた際は、
554 .B PTRACE_SETOPTIONS
555
556 .B PTRACE_OLDSETOPTIONS
557 に定義し直すことで対処できる。
558 .SH 関連項目
559 .BR gdb (1),
560 .BR strace (1),
561 .BR execve (2),
562 .BR fork (2),
563 .BR signal (2),
564 .BR wait (2),
565 .BR exec (3),
566 .BR capabilities (7)