Linux高级调试与优化——ptrace
ptrace (process trace)
#include <sys/ptrace.h> long ptrace(enum __ptrace_request request, pid_t pid, void *addr, void *data);
ptrace系統(tǒng)調(diào)用運(yùn)行tracer進(jìn)程監(jiān)視和控制tracee進(jìn)程的執(zhí)行過程,檢查和修改tracee進(jìn)程的內(nèi)存和寄存器值。ptrace主要用來實(shí)現(xiàn)端點(diǎn)調(diào)試和跟蹤系統(tǒng)調(diào)用。
tracee進(jìn)程首先需要attach在tracer進(jìn)程上,attach和接下來的命令是以線程為單位的,每一個tracee的線程都需要單獨(dú)attach到一個不同的tracer進(jìn)程上,如果沒有attach到tracer上,則無法進(jìn)行調(diào)試。
ptrace系統(tǒng)調(diào)用根據(jù)request分為不同的應(yīng)用場景:
1) PTRACE_TRACEME
子線程中通過PTRACE_TRACEME請求父線程跟蹤自己,只有PTRACE_TRACEME請求ID是tracee調(diào)用的,其他請求ID都是tracer調(diào)用的。
ptrace(PTRACE_TRACEME, NULL, NULL, NULL);
2) PTRACE_PEEKTEXT,PTRACE_PEEKDATA
從tracee的內(nèi)存addr處讀取一個雙字節(jié)數(shù)據(jù)。
Linux不區(qū)分代碼地址空間和數(shù)據(jù)地址空間,所以這兩個請求ID是一樣的。
3) PTRACE_PEEKUSER
從tracee的用戶區(qū)addr處讀取一個雙字節(jié)數(shù)據(jù),通常包含寄存器值和進(jìn)程相關(guān)的信息。(sys/user.h)
4) PTRACE_PORKTEXT,PTRACE_POKEDATA
將data雙字節(jié)數(shù)據(jù)寫入tracee內(nèi)存的addr處
5) PTRACE_POKEUSER
拷貝一個雙字節(jié)數(shù)據(jù)data到tracee的用戶區(qū)addr處
6) PTRACE_GETREGS,PTRACE_GETFPREGS
拷貝tracee的通用寄存器值或者浮點(diǎn)寄存器值到tracer的data處。不是所有的CPU架構(gòu)都支持該請求
7) PTRACE_GETREGSET
讀取tracee的寄存器
8) PTRACE_SETREGS,PTRACE_SETFPREGS
修改tracee的通用寄存器或者浮點(diǎn)寄存器
9) PTRACE_SETREGSET
修改tracee的寄存器
10) PTRACE_GETSIGINFO
獲取導(dǎo)致tracee停止執(zhí)行的信號量。通過data返回siginfo_t結(jié)構(gòu)體
11) PTRACE_SETSIGINFO
設(shè)置信號量,這樣正常發(fā)給tracee的信號量會首先被tracer捕獲
12) PTRACE_PEEKSIGINFO
只讀tracee的siginfo_t結(jié)構(gòu)體
13) PTRACE_GETSIGMASK
獲取tracee屏蔽的信號量
14) PTRACE_SETSIGMASK
設(shè)置tracee信號量屏蔽屬性
15) PTRACE_SETOPTIONS
16) PTRACE_GETEVENTMSG
獲取ptrace消息事件
17) PTRACE_CONT
重新運(yùn)行停止運(yùn)行的tracee線程
18) PTRACE_SYSCALL,PTRACE_SIGLESTEP
單步調(diào)試tracee
19) PTRACE_SYSEMU,PTRACE_SYSEMU_SIGLESTEP
20) PTRACE_LISTEN
重啟停止的tracee,但是不執(zhí)行它
21) PTRACE_KILL
給tracee發(fā)送SIGKILL終止它運(yùn)行
22) PTRACE_INTERRUPT
停止tracee運(yùn)行
23) PTRACE_ATTACH
附著在pid進(jìn)程上,讓他成為調(diào)用者的tracee
24) PTRACE_SZIZE
與PTRACE_ATTACH不同的是,該請求不會停止tracee的執(zhí)行
25) PTRACE_DETACH
取消附著,恢復(fù)tracee執(zhí)行
總結(jié)
以上是生活随笔為你收集整理的Linux高级调试与优化——ptrace的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 大论文排版技巧
- 下一篇: pxelinux.0:winboot:网