linux ptrace 读内存,Linux高级调试与优化——ptrace
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執行
總結
以上是生活随笔為你收集整理的linux ptrace 读内存,Linux高级调试与优化——ptrace的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: css怎样使弹跳的小球旋转,如何使用纯C
- 下一篇: matlab去除图片水印_(水印去除技巧