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

Linux高级调试与优化——ptrace的更多相关文章

  1. Linux高级调试与优化——gdb调试命令

    番外 2019年7月26日至27日,公司邀请<软件调试>和<格蠹汇编——软件调试案例集锦>两本书的作者张银奎老师进行<Linux高级调试与优化>培训,有幸聆听张老师 ...

  2. Linux高级调试与优化——信号量机制与应用程序崩溃

    背景介绍 Linux分为内核态和用户态,用户态通过系统调用(syscall)进入内核态执行. 用户空间的glibc库将Linux内核系统调用封装成GNU C Library库文件(兼容ANSI &am ...

  3. Linux高级调试与优化——同时抓取coredump和maps文件

    Linux内核源码 Documentation/sysctl/kernel.txt core_pattern: core_pattern: core_pattern is used to specif ...

  4. Linux高级调试与优化——内存泄漏实战分析

    最近在整理Linux调试方面的文档,正好碰到了一个内存泄漏踩栈的问题,借此机会记录一下分析过程. 首先,发现问题之后,赶紧看一下产生coredump文件没有,果不其然,产生了coredump,果断上g ...

  5. Linux高级调试与优化——内存管理

    1.物理地址和虚拟地址 Linux采用页表机制管理内存,32位系统中页大小一般为4KB,物理内存被划分为连续的页,每一个页都有一个唯一的页号. 为了程序的的可移植性,进程往往需要运行在flat mem ...

  6. Linux高级调试与优化——用户态堆

    内存问题是软件世界的住房问题 嵌入式Linux系统中,物理内存资源通常比较紧张,而不同的进程可能不停地分配和释放不同大小的内存,因此需要一套高效的内存管理机制. 内存管理可以分为三个层次,自底向上分别 ...

  7. Linux高级调试与优化——Address Sanitizer

    Address Sanitizer ASAN最早可以追溯到 LLVM 的 sanitizers项目(https://github.com/google/sanitizers),这个项目包含了Addre ...

  8. Linux高级调试与优化——进程管理和调度

    进程管理 进程和文件是Linux操作系统的两个最基本的抽象. 进程是处于执行期的程序,进程不仅仅局限于一段可执行程序代码,通常还包含其他资源,如打开的文件.挂起的信号.内核内部数据.处理器状态.进程地 ...

  9. Linux内核调试的方式以及工具集锦【转】

    转自:https://blog.csdn.net/gatieme/article/details/68948080 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原 ...

随机推荐

  1. 跑满带宽的一款百度网盘下载工具 : PanDownload

    下载地址 : 点击进入 官网上面也有介绍使用.在这里,我再说一下 下载之后,解压,运行,登录, 登录好之后,准备进行设置 重要:下载情况分以下三部分 下载内容 < 300M,选择`打包下载`,只 ...

  2. 全年DDoS攻击分析|知道创宇云安全2018年度网络安全态势报告

    *本报告由知道创宇云安全出品* 数据来源:知道创宇云防御平台 前言 2018年,网络安全领域暗流涌动,攻击趋势不断攀升,T级DDoS攻击多次爆发.数据泄露事件层出不穷.勒索软件大行其道.此外,随着我国 ...

  3. 10、LNMP架构

    1LNMP架构概述 1.1.什么是LNMP  LNMP 是一套技术的组合,L = Linux,N = Nginx,M~ = MySQL,P~ = PHP 1.2.LNMP架构是如何工作的 首先Ngin ...

  4. 为何 linux 要用 tar.gz,而不用 7z 或 zip?

    因为 7z 和 zip 压缩格式都不能保留 unix 风格的文件权限,比如解压出个可执行文件要重新 chmod chown 才能恢复正常.而 tar 格式可以.而 tar 本身不提供压缩,无非就是把包 ...

  5. 常见shell用法

    分析nginx访问日志 awk '{a[b[$1]++]}END{for(i=length(a);i>0;i--)for(j in b)if(b[j]==i){c++;if(c<=10)p ...

  6. 修正zen cart商品评论显示太短的问题

    找到includes\modules\pages\product_reviews\header_php.php $reviews_query_raw = “SELECT r.reviews_id, l ...

  7. supdf

    https://github.com/sumatrapdfreader/sumatrapdf/tree/master/src c++  java

  8. JavaWeb--ServletContext

    https://www.jianshu.com/p/31d27181d542 java类中获取ServletContext的方法 起因是我想要获取一个相对路径,需要用到servletContext的g ...

  9. Jquery+json绑定带层次下拉框(select控件)

    一.实现的效果图 备注: 1.主要实现添加类别绑定到Ztree树之后,select下拉框在不刷新页面的情况下,通过Jquery重新绑定问题,增加用户体验度: 2.这个只是实现两层的绑定,通过sql语句 ...

  10. git常用命令及常见问题解析

    1.查看状态 1.git status 2.git status -a 2.初始化一个git仓库 git init git clone 'git仓库地址' 3.添加到暂存区 //目录 git add ...