Unix-system-calls-ptrace
[top]#
[[File:]]
[[File:]] |
|Web |This Site
- 初心者向けのUnix *
- Unix-ホーム
- Unix-はじめに
- Unix-ファイル管理
- Unix-ディレクトリ
- Unix-ファイル権限
- Unix-環境
- Unix-基本ユーティリティ
- Unix-パイプとフィルタ
- Unix-プロセス
- Unix-コミュニケーション
- Unix-The Vi Editor
- Unix Shellプログラミング*
- Unix-シェルとは?
- Unix-変数の使用
- Unix-特殊変数
- Unix-配列の使用
- Unix-基本的な演算子
- Unix-意思決定
- Unix-シェルループ
- Unix-ループ制御
- Unix-シェル置換
- Unix-引用メカニズム
- Unix-IOリダイレクト
- UNIX-シェル関数
- Unix-マンページヘルプ
- 高度なUnix *
- Unix-正規表現
- Unix-ファイルシステムの基本
- Unix-ユーザー管理
- Unix-システムパフォーマンス
- Unix-システムログ
- Unix-信号とトラップ
- Unixの便利なリファレンス*
- Unix-便利なコマンド
- Unix-クイックガイド
- Unix-組み込み関数
- Unix-システムコール
- Unix-コマンドリスト
- Unixの役立つリソース*
- Unix役立つリソース
選択した読書
- http://www.finddevguides.com/computer_glossary [コンピュータ用語集] *http://www.finddevguides.com/computer_whoiswho[Who is Who]
Copyright©2014 by finddevguides
Home | References | Discussion Forums | About TP |
ptrace()-Unix、Linuxシステムコール
[[File:]] image :http://www.finddevguides.com/images/next.gif [next] image:http://www.finddevguides.com/add- this.gif [AddThisソーシャルブックマークボタン]
広告
NAME
ptrace-プロセストレース
概要
#include <sys/ptrace.h> long ptrace(enum __ptrace_request request, pid_t pid, void* addr, void *data); |
説明
親は、 fork (2)を呼び出し、結果の子にPTRACE_TRACEMEを実行させ、その後(通常) exec (3)を実行することにより、トレースを開始できます。 または、親はPTRACE_ATTACHを使用して既存のプロセスのトレースを開始できます。
トレースされている間、たとえシグナルが無視されていても、シグナルが配信されるたびに子は停止します。 (例外はSIGKILLで、通常の効果があります。)親は次の wait (2)で通知され、停止中に子プロセスを検査および変更できます。 その後、親は子を続行させ、オプションで配信された信号を無視します(または代わりに別の信号を配信します)。
親がトレースを終了すると、PTRACE_KILLで子を終了するか、PTRACE_DETACHを介して通常のトレースされていないモードで子を実行し続けることができます。
_request_の値は、実行されるアクションを決定します。
Tag
説明
PTRACE_TRACEME
このプロセスがその親によってトレースされることを示します。 このプロセスに配信されるシグナル(SIGKILLを除く)は、プロセスを停止させ、その親に wait ()を介して通知します。 また、このプロセスによる exec ()の以降のすべての呼び出しにより、SIGTRAPが送信され、新しいプログラムが実行を開始する前に親に制御を取得する機会が与えられます。 親がトレースを期待していない場合、プロセスはおそらくこのリクエストを行うべきではありません。 (pid _、 addr_、および_data_は無視されます。)
上記のリクエストは、子プロセスによってのみ使用されます。残りは親によってのみ使用されます。 次のリクエストでは、_pid_は、処理対象の子プロセスを指定します。 PTRACE_KILL以外のリクエストの場合、子プロセスを停止する必要があります。
PTRACE_PEEKTEXT、PTRACE_PEEKDATA
子のメモリ内の位置_addr_で単語を読み取り、 ptrace ()呼び出しの結果としてその単語を返します。 Linuxには個別のテキストアドレススペースとデータアドレススペースがないため、現在2つの要求は同等です。 (引数_data_は無視されます。)
PTRACE_PEEKUSR
子の USER 領域のオフセット_addr_にある単語を読み取ります。この領域には、プロセスに関するレジスタおよびその他の情報が保持されます(<linux/user.h>および<sys/user.h>を参照)。 単語は ptrace ()呼び出しの結果として返されます。 通常、オフセットはワードに揃える必要がありますが、これはアーキテクチャによって異なる場合があります。 注を参照してください。 (_data_は無視されます。)
PTRACE_POKETEXT、PTRACE_POKEDATA
単語_data_を子のメモリ内の場所_addr_にコピーします。 上記のように、2つのリクエストは現在同等です。
PTRACE_POKEUSR
単語_data_を子の USER 領域のオフセット_addr_にコピーします。 上記のように、オフセットは通常、ワードに揃える必要があります。 カーネルの整合性を維持するために、 USER エリアへの一部の変更は許可されていません。
PTRACE_GETREGS、PTRACE_GETFPREGS
子の汎用レジスタまたは浮動小数点レジスタを、それぞれ親の位置_data_にコピーします。 このデータの形式については、<linux/user.h>をご覧ください。 (_addr_は無視されます。)
PTRACE_GETSIGINFO(Linux 2.3.99-pre6以降)
停止の原因となった信号に関する情報を取得します。 _siginfo_t_構造体( sigaction (2)を参照)を子から親の_data_の場所にコピーします。 (_addr_は無視されます。)
PTRACE_SETREGS、PTRACE_SETFPREGS
親の位置_data_から、それぞれ子の汎用レジスタまたは浮動小数点レジスタをコピーします。 PTRACE_POKEUSERに関しては、いくつかの汎用レジスタの変更が許可されない場合があります。 (_addr_は無視されます。)
PTRACE_SETSIGINFO(Linux 2.3.99-pre6以降)
信号情報を設定します。 _siginfo_t_構造体を親の場所_data_から子にコピーします。 これは、通常は子に配信され、トレーサーによってキャッチされた信号にのみ影響します。 ptrace ()自体によって生成された合成信号からこれらの通常の信号を見分けるのは難しいかもしれません。 (_addr_は無視されます。)
PTRACE_SETOPTIONS(Linux 2.4.6以降。注意事項についてはバグを参照)
親の_data_からptraceオプションを設定します。 (_addr_は無視されます。)_data_はオプションのビットマスクとして解釈され、次のフラグで指定されます。
Tag
説明
PTRACE_O_TRACESYSGOOD(Linux 2.4.6以降)
syscallトラップを配信する場合、シグナル番号のビット7を設定します(つまり、deliver(SIGTRAP | 0x80)。これにより、トレーサーは通常のトラップとsyscallによって引き起こされたトラップの違いを簡単に認識できます。 (PTRACE_O_TRACESYSGOODはすべてのアーキテクチャで動作するとは限りません。)
PTRACE_O_TRACEFORK(Linux 2.5.46以降)
SIGTRAPを使用して、次の fork ()呼び出しで子を停止します。 PTRACE_EVENT_FORK << 8で、SIGSTOPで開始される、新しく分岐したプロセスのトレースを自動的に開始します。 新しいプロセスのPIDは、PTRACE_GETEVENTMSGで取得できます。
PTRACE_O_TRACEVFORK(Linux 2.5.46以降)
SIGTRAPを使用して、次の vfork ()呼び出しで子を停止します。 PTRACE_EVENT_VFORK << 8であり、SIGSTOPで開始される、新しくvforkedされたプロセスのトレースを自動的に開始します。 新しいプロセスのPIDは、PTRACE_GETEVENTMSGで取得できます。
PTRACE_O_TRACECLONE(Linux 2.5.46以降)
SIGTRAPを使用して、次の clone ()呼び出しで子を停止します。 PTRACE_EVENT_CLONE << 8そして、新たにクローン化されたプロセスのトレースを自動的に開始します。これは、SIGSTOPで開始されます。 新しいプロセスのPIDは、PTRACE_GETEVENTMSGで取得できます。 このオプションは、すべての場合において clone ()呼び出しをキャッチするとは限りません。 子がCLONE_VFORKフラグを指定して clone ()を呼び出した場合、PTRACE_O_TRACEVFORKが設定されていると、代わりにPTRACE_EVENT_VFORKが配信されます。それ以外の場合、子が終了シグナルをSIGCHLDに設定して clone ()を呼び出すと、PTRACE_O_TRACEFORKが設定されているとPTRACE_EVENT_FORKが配信されます。
PTRACE_O_TRACEEXEC(Linux 2.5.46以降)
SIGTRAPを使用して、次の exec ()呼び出しで子を停止します。 PTRACE_EVENT_EXEC << 8。
PTRACE_O_TRACEVFORKDONE(Linux 2.5.60以降)
SIGTRAPを使用した次の vfork ()呼び出しの完了時に子を停止します。 PTRACE_EVENT_VFORK_DONE << 8。
PTRACE_O_TRACEEXIT(Linux 2.5.60以降)
SIGTRAPで終了時に子を停止します| PTRACE_EVENT_EXIT << 8。 子の終了ステータスは、PTRACE_GETEVENTMSGで取得できます。 この停止は、レジスタがまだ利用可能なプロセスの終了時に早期に行われ、トレーサーは終了が発生した場所を確認できますが、通常の終了通知はプロセスの終了後に行われます。 コンテキストが利用可能であっても、トレーサーはこの時点で終了が発生するのを防ぐことはできません。
PTRACE_GETEVENTMSG(Linux 2.5.46以降)
発生したばかりのptraceイベントに関するメッセージを(_unsigned long_として)取得し、親の_data_の場所に配置します。 PTRACE_EVENT_EXITの場合、これは子供の終了ステータスです。 PTRACE_EVENT_FORK、PTRACE_EVENT_VFORK、およびPTRACE_EVENT_CLONEの場合、これは新しいプロセスのPIDです。 (_addr_は無視されます。)
PTRACE_CONT
停止した子プロセスを再起動します。 _data_がゼロ以外でSIGSTOPではない場合、子に配信されるシグナルとして解釈されます。そうでない場合、シグナルは配信されません。 したがって、たとえば、親は子に送信された信号を配信するかどうかを制御できます。 (_addr_は無視されます。)
PTRACE_SYSCALL、PTRACE_SINGLESTEP
PTRACE_CONTの場合と同様に、停止した子を再起動しますが、システムコールの次のエントリまたはシステムコールの終了時、または単一の命令の実行後にそれぞれ子が停止するように調整します。 (通常、子は信号を受信すると停止します。)親の観点からは、子はSIGTRAPの受信によって停止したように見えます。 したがって、たとえばPTRACE_SYSCALLの場合、最初の停止でシステムコールへの引数を検査し、2回目の停止で別のPTRACE_SYSCALLを実行してシステムコールの戻り値を検査するという考え方です。 (_addr_は無視されます。)
PTRACE_SYSEMU、PTRACE_SYSEMU_SINGLESTEP(Linux 2.6.14以降)
PTRACE_SYSEMUの場合は、実行されない次のsyscallへのエントリで続行および停止します。 PTRACE_SYSEMU_SINGLESTEPについては、syscallでない場合は同じ手順を実行しますが、シングルステップも実行します。 この呼び出しは、すべての子のシステムコールをエミュレートするユーザーモードLinuxなどのプログラムで使用されます。 (_addr_と_data_は無視されます。すべてのアーキテクチャでサポートされているわけではありません。)
PTRACE_KILL
子にSIGKILLを送信して終了します。 (_addr_と_data_は無視されます。)
PTRACE_ATTACH
_pid_で指定されたプロセスにアタッチし、現在のプロセスのトレースされた「子」にします。子の動作は、PTRACE_TRACEMEを実行したかのようになります。 現在のプロセスは、実際にはほとんどの目的で子プロセスの親になります(たとえば、子イベントの通知を受信し、 ps (1)出力に子の親として表示されます)が、 getppid (2)子は元の親のPIDを返します。 子にはSIGSTOPが送信されますが、この呼び出しの完了によって必ずしも停止するわけではありません。 wait ()を使用して、子が停止するのを待ちます。 (_addr_と_data_は無視されます。)
PTRACE_DETACH
PTRACE_CONTの場合と同様に、停止した子を再起動しますが、最初にプロセスから切り離され、PTRACE_ATTACHのリペアレント効果とPTRACE_TRACEMEの効果が取り消されます。 おそらく意図されていませんが、Linuxでは、トレースを開始するために使用された方法に関係なく、トレースされた子をこの方法で切り離すことができます。 (_addr_は無視されます。)
ノート
メモリおよびUSER領域のコンテンツのレイアウトは、OSおよびアーキテクチャ固有です。 指定されたオフセットと返されるデータは、_struct user_の定義と完全に一致しない場合があります
「ワード」のサイズは、OSの種類によって決まります(たとえば、32ビットLinuxの場合は32ビットなど)。
トレースにより、トレースされるプロセスのセマンティクスにわずかな違いが生じます。 たとえば、プロセスがPTRACE_ATTACHで接続されている場合、元の親は停止時に wait ()を介して通知を受信できなくなり、新しい親がこの通知を効果的にシミュレートする方法はありません。
このページでは、現在Linuxで ptrace ()呼び出しが機能する方法について説明しています。 その動作は、Unixの他のフレーバーでは著しく異なります。 いずれの場合でも、 ptrace ()の使用は、OSおよびアーキテクチャ固有です。
SunOSのマニュアルページでは、 ptrace ()を「一意で不可解な」と説明しています。 Solaris 2に存在するprocベースのデバッグインターフェイスは、 ptrace ()機能のスーパーセットをより強力で統一された方法で実装します。
返り値
成功すると、PTRACE_PEEK *リクエストはリクエストされたデータを返し、他のリクエストはゼロを返します。 エラーの場合、すべての要求は-1を返し、_errno_は適切に設定されます。 成功したPTRACE_PEEK *要求によって返される値は-1である可能性があるため、呼び出し元は、そのような要求の後に_errno_をチェックして、エラーが発生したかどうかを判断する必要があります。
BUGS
2.6カーネルヘッダーを持つホストでは、PTRACE_SETOPTIONSは2.4の値とは異なる値で宣言されます。 これにより、2.4カーネルで実行すると、そのようなヘッダーでコンパイルされたアプリケーションが失敗します。 これを回避するには、PTRACE_SETOPTIONSをPTRACE_OLDSETOPTIONSに再定義します(定義されている場合)。
エラー
Tag | Description |
---|---|
EBUSY | (i386 only) There was an error with allocating or freeing a debug register. |
EFAULT | There was an attempt to read from or write to an invalid area in the parent’s or child’s memory, probably because the area wasn’t mapped or accessible. Unfortunately, under Linux, different variations of this fault will return EIO or EFAULT more or less arbitrarily. |
EINVAL | An attempt was made to set an invalid option. |
EIO | request is invalid, or an attempt was made to read from or write to an invalid area in the parent’s or child’s memory, or there was a word-alignment violation, or an invalid signal was specified during a restart request. |
*EPERM * | The specified process cannot be traced. This could be because the parent has insufficient privileges (the required capability is* CAP_SYS_PTRACE*); non-root processes cannot trace processes that they cannot send signals to or those running set-user-ID/set-group-ID programs, for obvious reasons. Alternatively, the process may already be being traced, or be init (PID 1). |
ESRCH | The specified process does not exist, or is not currently being traced by the caller, or is not stopped (for requests that require that). |
準拠
SVr4、4.3BSD
関連項目
- gdb(1)
- strace(1)
- execve(2)
- fork(2)
- signal(2)
- http://www.finddevguides.com/unix_system_calls/wait [待機(2)]
[[File:]] image :http://www.finddevguides.com/images/next.gif [next] [[File:]]
広告
Advertisements |