ptrace (process trace)

#include <sys/ptrace.h>

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

最新文章

  1. Linux下mysql忘记root密码
  2. Linux C 开发环境配置
  3. Entity Framework 实体框架的形成之旅--利用Unity对象依赖注入优化实体框架(2)
  4. BUILD 2015: Visual Studio对GitHub的支持
  5. How to use VS2012 remote debug Windows Azure Cloud Services
  6. JQuery中的小技巧,,,连载中。。。
  7. BZOJ 3224: Tyvj 1728 普通平衡树 vector
  8. Android 颜色渲染(十) ComposeShader组合渲染
  9. Queue学习
  10. Android Studio入门到精通
  11. SPARK-AM-TrackURL-UI-500
  12. 互联网同步yum服务器阿里云 reposync createrepo
  13. 第四章:Android架构
  14. 【python】中文提取,判断,分词
  15. R 语言 相关入门资料
  16. scala 日期格式转换
  17. sql经常出现死锁解决办法
  18. C++作用域 (二)
  19. JS获取URL中参数值(QueryString)的4种方法分享
  20. Java复习3.变量.常量.String.

热门文章

  1. js获取url(request)中的参数
  2. ccs之经典布局(一)(水平垂直居中)
  3. 第八篇 CSS定位
  4. ab测试工具的使用
  5. JVM内存区域划分总结
  6. mysql 5.7.24 root密码重置
  7. 全自动链接克隆KVM虚拟机
  8. Linux 查看主机、CPU、内存、内核、网卡或MAC地址、关机、重启、当前使用人、网络连接状态、主机目前使用状态
  9. Reservoir Computing: Harnessing a Universal Dynamical System
  10. 防sql注入方法