標籤 | 描述 |
PTRACE_TRACEME |
| 指示此程序將由其父程序跟蹤。傳遞給此程序的任何訊號(除 SIGKILL 外)都會導致其停止,並透過wait() 通知其父程序。此外,此程序隨後對exec() 的所有呼叫都將導致向其傳送 SIGTRAP,從而使父程序有機會在新的程式開始執行之前獲得控制權。如果父程序沒有預期跟蹤它,則程序可能不應該發出此請求。(pid、addr 和 data 被忽略。) |
上述請求僅由子程序使用;其餘請求僅由父程序使用。在以下請求中,pid 指定要對其進行操作的子程序。對於 PTRACE_KILL 之外的請求,子程序必須已停止。 |
PTRACE_PEEKTEXT,PTRACE_PEEKDATA |
| 讀取子程序記憶體中地址 addr 處的一個字,並將該字作為ptrace() 呼叫的結果返回。Linux 沒有單獨的文字和資料地址空間,因此這兩個請求目前等效。(引數 data 被忽略。) |
PTRACE_PEEKUSR |
| 讀取子程序USER區域中偏移量 addr 處的一個字,該區域儲存有關程序的暫存器和其他資訊(參見<linux/user.h> 和 <sys/user.h>)。該字作為ptrace() 呼叫的結果返回。通常,偏移量必須與字對齊,儘管這可能因體系結構而異。參見注釋。(data 被忽略。) |
PTRACE_POKETEXT,PTRACE_POKEDATA |
| 將字 data 複製到子程序記憶體中地址 addr 處。如上所述,這兩個請求目前等效。 |
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 被解釋為選項的位掩碼,這些選項由以下標誌指定
標籤 | 描述 |
PTRACE_O_TRACESYSGOOD(自 Linux 2.4.6 起) | | 在傳遞系統呼叫陷阱時,設定訊號編號中的第 7 位(即,傳遞 (SIGTRAP | 0x80) 這使得跟蹤器很容易區分正常陷阱和由系統呼叫引起的陷阱。(PTRACE_O_TRACESYSGOOD 可能不適用於所有體系結構。) |
PTRACE_O_TRACEFORK(自 Linux 2.5.46 起) | | 在下一個fork() 呼叫處使用 SIGTRAP | PTRACE_EVENT_FORK << 8 停止子程序,並自動開始跟蹤新分叉的程序,該程序將以 SIGSTOP 開始。新程序的 PID 可以使用 PTRACE_GETEVENTMSG 檢索。 |
PTRACE_O_TRACEVFORK(自 Linux 2.5.46 起) | | 在下一個vfork() 呼叫處使用 SIGTRAP | PTRACE_EVENT_VFORK << 8 停止子程序,並自動開始跟蹤新 vfork 的程序,該程序將以 SIGSTOP 開始。新程序的 PID 可以使用 PTRACE_GETEVENTMSG 檢索。 |
PTRACE_O_TRACECLONE(自 Linux 2.5.46 起) | | 在下一個clone() 呼叫處使用 SIGTRAP | 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 起) | | 在下一個exec() 呼叫處使用 SIGTRAP | PTRACE_EVENT_EXEC << 8 停止子程序。 |
PTRACE_O_TRACEVFORKDONE(自 Linux 2.5.60 起) | | 在下一個vfork() 呼叫完成後使用 SIGTRAP | 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,想法是在第一次停止時檢查系統呼叫的引數,然後執行另一個 PTRACE_SYSCALL 並檢查第二次停止時系統呼叫的返回值。(addr 被忽略。) |
PTRACE_SYSEMU,PTRACE_SYSEMU_SINGLESTEP(自 Linux 2.6.14 起) |
| 對於 PTRACE_SYSEMU,繼續並在進入下一個系統呼叫時停止,該系統呼叫將不會執行。對於 PTRACE_SYSEMU_SINGLESTEP,執行相同的操作,但如果這不是系統呼叫,則也進行單步執行。此呼叫由 User Mode 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 被忽略。) |