ptrace (process trace)
#include
long ptrace(enum __ptrace_request request, pid_t pid, void *addr, void *data);
ptrace系統調用運作tracer程序監視和控制tracee程序的執行過程,檢查和修改tracee程序的記憶體和寄存器值。ptrace主要用來實作端點調試和跟蹤系統調用。
tracee程序首先需要attach在tracer程序上,attach和接下來的指令是以線程為機關的,每一個tracee的線程都需要單獨attach到一個不同的tracer程序上,如果沒有attach到tracer上,則無法進行調試。
ptrace系統調用根據request分為不同的應用場景:
1) PTRACE_TRACEME
子線程中通過PTRACE_TRACEME請求父線程跟蹤自己,隻有PTRACE_TRACEME請求ID是tracee調用的,其他請求ID都是tracer調用的。
ptrace(PTRACE_TRACEME, NULL, NULL, NULL);
2) PTRACE_PEEKTEXT,PTRACE_PEEKDATA
從tracee的記憶體addr處讀取一個雙位元組資料。
Linux不區分代碼位址空間和資料位址空間,是以這兩個請求ID是一樣的。
3) PTRACE_PEEKUSER
從tracee的使用者區addr處讀取一個雙位元組資料,通常包含寄存器值和程序相關的資訊。(sys/user.h)
4) PTRACE_PORKTEXT,PTRACE_POKEDATA
将data雙位元組資料寫入tracee記憶體的addr處
5) PTRACE_POKEUSER
拷貝一個雙位元組資料data到tracee的使用者區addr處
6) PTRACE_GETREGS,PTRACE_GETFPREGS
拷貝tracee的通用寄存器值或者浮點寄存器值到tracer的data處。不是所有的CPU架構都支援該請求
7) PTRACE_GETREGSET
讀取tracee的寄存器
8) PTRACE_SETREGS,PTRACE_SETFPREGS
修改tracee的通用寄存器或者浮點寄存器
9) PTRACE_SETREGSET
修改tracee的寄存器
10) PTRACE_GETSIGINFO
擷取導緻tracee停止執行的信号量。通過data傳回siginfo_t結構體
11) PTRACE_SETSIGINFO
設定信号量,這樣正常發給tracee的信号量會首先被tracer捕獲
12) PTRACE_PEEKSIGINFO
隻讀tracee的siginfo_t結構體
13) PTRACE_GETSIGMASK
擷取tracee屏蔽的信号量
14) PTRACE_SETSIGMASK
設定tracee信号量屏蔽屬性
15) PTRACE_SETOPTIONS
16) PTRACE_GETEVENTMSG
擷取ptrace消息事件
17) PTRACE_CONT
重新運作停止運作的tracee線程
18) PTRACE_SYSCALL,PTRACE_SIGLESTEP
單步調試tracee
19) PTRACE_SYSEMU,PTRACE_SYSEMU_SIGLESTEP
20) PTRACE_LISTEN
重新開機停止的tracee,但是不執行它
21) PTRACE_KILL
給tracee發送SIGKILL終止它運作
22) PTRACE_INTERRUPT
停止tracee運作
23) PTRACE_ATTACH
附着在pid程序上,讓他成為調用者的tracee
24) PTRACE_SZIZE
與PTRACE_ATTACH不同的是,該請求不會停止tracee的執行
25) PTRACE_DETACH
取消附着,恢複tracee執行