Created
May 27, 2014 15:37
-
-
Save hnw/17626c989b9ae8bb96b7 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
●PTRACE_ATTACH | |
pid で指定されたプロセスに接続 (attach) し、それを現在のプロセスの子プ | |
ロセスとしてトレースできるようにする。子プロセスは PTRACE_TRACEME した | |
かのように振舞う。現在のプロセスはそのほとんどの目的において、 その子プ | |
ロセスの実際の親になる (例えば、子プロセスのイベントの 通知を受けとった | |
り、 ps(1) で親として表示されたりする)。しかし、子プロセスで | |
getppid(2) を実行した場合には元の親プロセスの PID が返される。 子プロセ | |
スには SIGSTOP が送られるが、この呼び出しが完了するまでに 必ずしも停止 | |
するとは限らない。子プロセスの停止を待つには wait(2) を使用すること。 | |
(addr と data は無視される。) | |
●PTRACE_CONT | |
停止した子プロセスの実行を再開させる。 data がゼロでなく、 SIGSTOP でも | |
なければ、 子プロセスに配送されるシグナルと解釈される。 ゼロや SIGSTOP | |
の場合はシグナルは配送されない。 これを使うと、例えば、親プロセスは 子 | |
プロセスに送られたシグナルを実際に配送するかどうかを 制御することができ | |
る。(addr は無視される。) | |
●PTRACE_DETACH | |
PTRACE_CONT と同様に停止した子プロセスを再開する。ただし まずそのプロセ | |
スからの分離 (detach) を行い、 PTRACE_ATTACH での親の切り換えによる効果 | |
と PTRACE_TRACEME の効果を取り消す。意図したものではないだろうが、 | |
Linux では、トレースされている子プロセスはどのような方法でトレースを 開 | |
始されたとしても、この方法で分離 (detach) することができる。 (addr は無 | |
視される。) | |
●PTRACE_GETEVENTMSG | |
発生したばかりの ptrace イベントに関するメッセージを (unsigned long 型 | |
で) 取得する。 取得したメッセージは親プロセスの data の位置に格納される。 | |
得られる内容は、 PTRACE_EVENT_EXIT の場合は子プロセスの終了ステータスで | |
あり、 PTRACE_EVENT_FORK, PTRACE_EVENT_VFORK, PTRACE_EVENT_CLONE の場合 | |
は新しいプロセスの PID である。 Linux 2.6.18 以降では、新しいプロセスの | |
PID は PTRACE_EVENT_VFORK_DONE で入手できる。 (addr は無視される。) | |
●PTRACE_GETREGS | |
それぞれ、子プロセスの汎用レジスタ、浮動小数点レジスタを親プロセスの | |
data の位置にコピーする。この data の書式に関しては <linux/user.h> を参 | |
照すること。(addr は無視される。) | |
●PTRACE_GETREGSET (since Linux 2.6.34) | |
Read the tracee's registers. addr specifies, in an | |
architecture-dependent way, the type of registers to be read. | |
NT_PRSTATUS (with numerical value 1) usually results in | |
reading of general-purpose registers. If the CPU has, for | |
example, floating-point and/or vector registers, they can be | |
retrieved by setting addr to the corresponding NT_foo | |
constant. data points to a struct iovec, which describes the | |
destination buffer's location and length. On return, the | |
kernel modifies iov.len to indicate the actual number of bytes | |
returned. | |
●PTRACE_GETSIGINFO | |
停止の原因となったシグナルに関する情報を取得する。 siginfo_t 構造体 | |
(sigaction(2) 参照) を子プロセスから親プロセスの data の位置にコピーす | |
る。 (addr は無視される。) | |
●PTRACE_INTERRUPT (since Linux 3.4) | |
Stop a tracee. If the tracee is running or sleeping in kernel | |
space and PTRACE_SYSCALL is in effect, the system call is | |
interrupted and syscall-exit-stop is reported. (The | |
interrupted system call is restarted when the tracee is | |
restarted.) If the tracee was already stopped by a signal and | |
PTRACE_LISTEN was sent to it, the tracee stops with | |
PTRACE_EVENT_STOP and WSTOPSIG(status) returns the stop | |
signal. If any other ptrace-stop is generated at the same | |
time (for example, if a signal is sent to the tracee), this | |
ptrace-stop happens. If none of the above applies (for | |
example, if the tracee is running in user space), it stops | |
with PTRACE_EVENT_STOP with WSTOPSIG(status) == SIGTRAP. | |
PTRACE_INTERRUPT only works on tracees attached by | |
PTRACE_SEIZE. | |
●PTRACE_PEEKDATA | |
子プロセスのメモリの addr の位置から 1 ワードを読み出す。読み出したワー | |
ドは ptrace() の返り値として返される。 Linux ではテキスト (text) とデー | |
タ (data) で 同じアドレス空間を使用するため、この 2 つの要求は現在のと | |
ころ 同じものである。 (引き数 data は無視される。) | |
●PTRACE_PEEKTEXT | |
子プロセスのメモリの addr の位置から 1 ワードを読み出す。読み出したワー | |
ドは ptrace() の返り値として返される。 Linux ではテキスト (text) とデー | |
タ (data) で同じアドレス空間を使用するため、この 2 つの要求は現在のと | |
ころ同じものである。 (引き数 data は無視される。) | |
●PTRACE_PEEKUSER | |
子プロセスの USER 領域のオフセット addr の位置から 1 ワードを読み込む。 | |
USER 領域にはそのプロセスの レジスタ (registers) などの情報が保持されて | |
いる。 (<linux/user.h> と <sys/user.h> を参照)。読み込んだワードは | |
ptrace() コールの結果として返される。 たいていはオフセットはワード境界 | |
になければならないが、 アーキテクチャによってはその必要はない。 (data | |
は無視される。 ) | |
●PTRACE_POKEUSER | |
ワード data を子プロセスの USER 領域のオフセット addr の位置にコピーす | |
る。 上と同様に、通常、オフセットはワード境界になければならない。 カー | |
ネルの完全性 (integrity) を維持するため、 変更内容によっては USER 領域 | |
の変更は禁止されている。 | |
●PTRACE_SEIZE (since Linux 3.4) | |
pidで指定されたプロセスに接続 (attach) し、それを現在のプロセスの子プロ | |
セスとしてトレースできるようにする。 PTRACE_ATTACH と異なり、 | |
PTRACE_SEIZE はその子プロセスを停止させない。PTRACE_SEIZE されたプロセ | |
スだけが PTRACE_INTERRUPT と PTRACE_LISTEN を受けとることができる。 | |
addr は0でなくてはならない。 data は ptrace のオプションのビットマスク | |
として解釈され、即座に反映される。 | |
●PTRACE_SETOPTIONS | |
親プロセスの data に基づいて ptrace のオプションを設定する (addr は無視 | |
される)。 data はオプションのビットマスクとして解釈され、 オプションに | |
は以下のフラグを指定できる:(省略、manを見よ) | |
●PTRACE_SETREGS | |
それぞれ、子プロセスの汎用レジスタ、浮動小数点レジスタに 親プロセスの | |
date の位置からコピーする。 PTRACE_POKEUSER と同様に、汎用レジスタによっ | |
ては 変更が禁止されている場合がある。 (addr は無視される。) | |
●PTRACE_SET_SYSCALL | |
(説明みつからず) | |
●PTRACE_SYSCALL | |
PTRACE_CONT と同様に停止した子プロセスを再開する。ただし、 | |
PTRACE_SYSCALL の場合は子プロセスが 次にシステムコールに入るかシステム | |
コールから抜けるかする時に、 PTRACE_SINGLESTEP の場合は 1 命令 | |
(instruction) 実行した後に停止させる (通常どおり、子プロセスはシグナル | |
を受け取った場合にも停止する)。 親プロセスから見ると、子プロセスは | |
SIGTRAP を受信して停止したように見える。そのため、例えば | |
PTRACE_SYSCALL を使うと、1回目の停止で引き数を調べて PTRACE_SYSCALL を | |
実行し、 2回目の停止でシステムコールの返り値を調べる、 というようなこと | |
ができる。(addr は無視される。) | |
●PTRACE_TRACEME | |
このプロセスが親プロセスによってトレースされることを表す。 このプロセス | |
に (SIGKILL 以外の) シグナルが配送されると、 プロセスは停止し、親プロセ | |
スに wait(2) を通じて通知される。 また、これ以降はこのプロセスが | |
execve(2) を呼び出す度に SIGTRAP が送信されるようになる。 これによって、 | |
親プロセスは 新しいプログラムが実行を開始する前に制御することができる。 | |
親プロセスが自プロセスをトレースするつもりがない場合には、 おそらくこの | |
プロセスは本要求を行うべきではないだろう。 (pid, addr, data は無視され | |
る。) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment