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执行

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值