Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save hnw/17626c989b9ae8bb96b7 to your computer and use it in GitHub Desktop.
Save hnw/17626c989b9ae8bb96b7 to your computer and use it in GitHub Desktop.
●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