• Linux高级调试与优化——ptrace


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

  • 相关阅读:
    Vuex的使用
    vue的props属性,vue的插槽
    ES6 Promise对象
    ES6 Map对象以及Set对象
    函数作用域以及块级作用域
    组件之间的传值-$refs&$parent
    Vue中父子组件的传值
    v-on 以及v-model的修饰符以及vue的常用指令
    时间线
    readline和xreadline的区别
  • 原文地址:https://www.cnblogs.com/justin-y-lin/p/11274710.html
Copyright © 2020-2023  润新知