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执行
Linux高级调试与优化——ptrace的更多相关文章
- Linux高级调试与优化——gdb调试命令
番外 2019年7月26日至27日,公司邀请<软件调试>和<格蠹汇编——软件调试案例集锦>两本书的作者张银奎老师进行<Linux高级调试与优化>培训,有幸聆听张老师 ...
- Linux高级调试与优化——信号量机制与应用程序崩溃
背景介绍 Linux分为内核态和用户态,用户态通过系统调用(syscall)进入内核态执行. 用户空间的glibc库将Linux内核系统调用封装成GNU C Library库文件(兼容ANSI &am ...
- Linux高级调试与优化——同时抓取coredump和maps文件
Linux内核源码 Documentation/sysctl/kernel.txt core_pattern: core_pattern: core_pattern is used to specif ...
- Linux高级调试与优化——内存泄漏实战分析
最近在整理Linux调试方面的文档,正好碰到了一个内存泄漏踩栈的问题,借此机会记录一下分析过程. 首先,发现问题之后,赶紧看一下产生coredump文件没有,果不其然,产生了coredump,果断上g ...
- Linux高级调试与优化——内存管理
1.物理地址和虚拟地址 Linux采用页表机制管理内存,32位系统中页大小一般为4KB,物理内存被划分为连续的页,每一个页都有一个唯一的页号. 为了程序的的可移植性,进程往往需要运行在flat mem ...
- Linux高级调试与优化——用户态堆
内存问题是软件世界的住房问题 嵌入式Linux系统中,物理内存资源通常比较紧张,而不同的进程可能不停地分配和释放不同大小的内存,因此需要一套高效的内存管理机制. 内存管理可以分为三个层次,自底向上分别 ...
- Linux高级调试与优化——Address Sanitizer
Address Sanitizer ASAN最早可以追溯到 LLVM 的 sanitizers项目(https://github.com/google/sanitizers),这个项目包含了Addre ...
- Linux高级调试与优化——进程管理和调度
进程管理 进程和文件是Linux操作系统的两个最基本的抽象. 进程是处于执行期的程序,进程不仅仅局限于一段可执行程序代码,通常还包含其他资源,如打开的文件.挂起的信号.内核内部数据.处理器状态.进程地 ...
- Linux内核调试的方式以及工具集锦【转】
转自:https://blog.csdn.net/gatieme/article/details/68948080 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原 ...
随机推荐
- Centos7:dubbo监控中心安装,配置和使用
制作dubbo-admin.war文件 下载dubbo-admin https://github.com/alibaba/dubbo 注:2.6版本后源码中不包含dubbo-admin工程 在dubb ...
- TypeScript 和 JavaScript 的区别
TypeScript 和 JavaScript 是目前项目开发中较为流行的两种脚本语言,我们已经熟知 TypeScript 是 JavaScript 的一个超集.JavaScript 和 TypeSc ...
- CentOS 7系统时间与实际时间差8个小时
1.查看系统时间: [root@localhost sysconfig]# timedatectl Local time: 一 2017-11-06 21:13:19 CST Universal ti ...
- shell 删除文本中的重复行
三种常见方法:第一,用sort+uniq,注意,单纯uniq是不行的. shell> sort -k2n file | uniq > a.out 这里我做了个简单的测试,当file中的重复 ...
- shelve:极其强大的序列化模块
介绍 数据持久化,就是把数据从内存刷到磁盘上.但是要保证在读取的时候还能恢复到原来的状态.像pickle和json之类的持久化模块基本上无需介绍了,这里介绍两个其他很少用但是功能很强大的模块. dbm ...
- linux基本操作和常用命令(2)
linux基本操作和常用命令(2) 第二部分主要是涉及到用户和组的概念,以及一些操作.涉及到用户和组的共三个文件,分别存放在/etc/shadow(密码信息) /etc/group(组信息) /etc ...
- ELK监控交换机日志
一.首先部署logstash监控UDP514端口,新建一个配置文件cisco.conf 交换机是通过配置rsyslog服务器来将日志发送到日志服务器的,所以需要在logstash上配置rsyslog监 ...
- 【BZOJ1016】【Luogu P4208】 [JSOI2008]最小生成树计数 最小生成树,矩阵树定理
蛮不错的一道题,遗憾就遗憾在数据范围会导致暴力轻松跑过. 最小生成树的两个性质: 不同的最小生成树,相同权值使用的边数一定相同. 不同的最小生成树,将其都去掉同一个权值的所有边,其连通性一致. 这样我 ...
- PMBOK :美国的项目管理知识体系
PMBOK 是Project Management Body Of Knowledge的缩写, 指项目管理知识体系的意思,具体是美国项目管理协会(PMI)对项目管理所需的知识.技能和工具进行的概括性描 ...
- 细数meta标签的奥秘
因为看到了一个很不错的h5自适应网站,觉得很不错,于是好奇心作祟,让我翻开了它的源码一探究竟,最先研究的是它的meta标签,好了,废话不多说,以下是我总结的和比较实用的meta标签,如有错误,请多多指 ...