ptrace

news2024/12/27 13:35:26

前言

gdb 的核心技术就是使用 ptrace 系统调用。

ptrace

NAME
       ptrace - process trace

SYNOPSIS
       #include <sys/ptrace.h>

       long ptrace(enum __ptrace_request request, pid_t pid,
                   void *addr, void *data);

DESCRIPTION
       The  ptrace()  system  call provides a means by which one process (the "tracer") may observe and control the execution of another process (the "tracee"),
       and examine and change the tracee's memory and registers.  It is primarily used to implement breakpoint debugging and system call tracing.

ptrace() 系统调用提供了一种方法,通过它,一个进程(“tracer”)可以观察和控制另一个进程(“tracee”)的执行,并且可以检查和改变 tracee 的内存和寄存器。它主要用于实现断点调试和系统调用跟踪。

ptrace() 的第一个参数 request 是枚举类型,其值和含义如下

PTRACE_TRACEME,   本进程被其父进程所跟踪。其父进程应该希望跟踪子进程
PTRACE_PEEKTEXT,  从内存地址中读取一个字节,内存地址由addr给出
PTRACE_PEEKDATA,  同上
PTRACE_PEEKUSER,  可以检查用户态内存区域(USER area),从USER区域中读取一个字节,偏移量为addr
PTRACE_POKETEXT,  往内存地址中写入一个字节。内存地址由addr给出
PTRACE_POKEDATA,  往内存地址中写入一个字节。内存地址由addr给出
PTRACE_POKEUSER,  往USER区域中写入一个字节,偏移量为addr
PTRACE_GETREGS,    读取寄存器
PTRACE_GETFPREGS,  读取浮点寄存器
PTRACE_SETREGS,  设置寄存器
PTRACE_SETFPREGS,  设置浮点寄存器
PTRACE_CONT,    重新运行
PTRACE_SYSCALL,  重新运行
PTRACE_SINGLESTEP,  设置单步执行标志
PTRACE_ATTACH,  追踪指定pid的进程
PTRACE_DETACH,  结束追踪

这里主要介绍 PTRACE_TRACEMEPTRACE_ATTACH,它们分别对应两种追踪模式。

PTRACE_TRACEME

ptrace(PTRACE_TRACEME, 0, 0, 0)
通常为被追踪者使用,用来指示此进程将由其父进程跟踪。示例如下:
被追踪进程 loop.c

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>

int main(int argc, char *argv[])
{
	int i = 0;

	printf("pid = %d\n", getpid());

	while (1) {
		printf("hello world %d\n", i++);
		sleep(1);
	}

	return EXIT_SUCCESS;
}

ptrace6.c

#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/ptrace.h>
#include <sys/wait.h>

int main(int argc, char *argv[])
{
	pid_t pid;
	int status;

	if (argc < 2) {
		fprintf(stderr, "Usage: %s <program> [args...]\n", argv[0]);
		return 1;
	}

	pid = fork();
	if (pid == 0) {
		// Child process
		ptrace(PTRACE_TRACEME, 0, NULL, NULL);
		execvp(argv[1], argv + 1);
		perror("execvp");
		exit(1);
	} else if (pid > 0) {
		// Parent process
		waitpid(pid, &status, 0);
		printf("Child started, pid = %d\n", pid);
		printf("chld got dignal:%s\n", strsignal(WSTOPSIG(status)));

		printf("子进程暂停 2s\n");
		sleep(2);

		printf("子进程继续执行 5s\n");
		ptrace(PTRACE_CONT, pid, NULL, NULL);
		sleep(5);

		printf("子进程暂停 3s\n");
		// 任何发给子进程的信号 signal(SIGKILL 除外)将导致子进程暂停运行
		kill(pid, SIGTRAP);
		sleep(3);

		printf("子进程继续执行 2s\n");
		ptrace(PTRACE_CONT, pid, NULL, NULL);
		sleep(2);

		printf("杀死子进程\n");
		kill(pid, SIGKILL);
	} else {
		perror("fork");
		return 1;
	}

	return 0;
}

编译、运行

gcc loop.c -o loop.out
gcc ptrace6.c -o ptrace6.out -Wall
$ ./ptrace6.out ./loop.out
Child started, pid = 979394
chld got dignal:Trace/breakpoint trap
子进程暂停 2s
子进程继续执行 5s
pid = 979394
hello world 0
hello world 1
hello world 2
hello world 3
hello world 4
子进程暂停 3s
子进程继续执行 2s
hello world 5
hello world 6
hello world 7
杀死子进程

父进程 fork 出一个子进程,子进程调用 PTRACE_TRACEME,表明这个进程由它的父进程来跟踪。
任何发给子进程的信号 signal(SIGKILL 除外)将导致子进程暂停运行,而它的父进程会通过 wait() 获得通知。
另外,子进程调用 exec 会使操作系统产生一个 SIGTRAP 信号发送给子进程,这让父进程有机会在新程序开始执行之前获得对子进程的控制权。

PTRACE_ATTACH

此追踪模式将主动发送一个停止信号给目标进程(ATTACH 模式),使目标程序暂停下来,进而进行调试。
ptrace7.c

#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/ptrace.h>
#include <sys/wait.h>

int main(int argc, char *argv[])
{
	pid_t pid;

	printf("请输入进程号:\n");
	scanf("%d", &pid);

	printf("子进程暂停 2s\n");
	ptrace(PTRACE_ATTACH, pid, NULL, NULL);
	sleep(2);

	printf("子进程继续执行 5s\n");
	ptrace(PTRACE_CONT, pid, NULL, NULL);
	sleep(5);

	printf("子进程暂停 3s\n");
	kill(pid, SIGTRAP);
	sleep(3);

	printf("子进程继续执行 2s\n");
	ptrace(PTRACE_CONT, pid, NULL, NULL);
	sleep(2);

	printf("结束对子进程的控制\n");
	ptrace(PTRACE_DETACH, pid, NULL, NULL);

	return 0;
}

编译、运行

gcc ptrace7.c -o ptrace7.out -Wall

请添加图片描述

番外

t+

当子进程被追踪并且暂停时,处于 t+ 状态,t 表示被跟踪状态(TASK_TRACED),+ 表示位于前台的进程组。

liyongj+  980243  0.0  0.0   2496   576 pts/93   t+   17:59   0:00 ./loop.out

Q:TASK_TRACED 状态的进程会被 CPU 调度吗?

A:TASK_TRACED 状态的进程不会被CPU调度。在 Linux 中,当一个进程被设置为 TASK_TRACED 状态时,它会暂停执行,并等待调试器或其它进程唤醒。操作系统会将该进程从可调度进程队列中移除,直到被唤醒后再次加入可调度队列。

S+

当子进程运行时,处于 S+ 状态,S 表示可中断的睡眠状态。

liyongj+  980243  0.0  0.0   2496   576 pts/93   S+   17:59   0:00 ./loop.out

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/499767.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

开关电源学习总结

本篇文章主要通过理论来大体的讲一下开关电源的设计的思考过程&#xff0c;希望对大家可以有所帮助。本人小白&#xff0c;如有质疑&#xff0c;可以评论区指出。 一、开关电源指标 1.输入电压与输入功率 在设计开关电源时&#xff0c;需要根据需求来设计输入电压和输入功率…

12 KVM虚拟机配置-配置虚拟设备(网络设备)

文章目录 12 KVM虚拟机配置-配置虚拟设备(网络设备)12.1 概述12.2 元素介绍12.3 配置示例 12 KVM虚拟机配置-配置虚拟设备(网络设备) 12.1 概述 XML配置文件可以配置虚拟网络设备&#xff0c;包括ethernet模式、bridge模式、vhostuser模式等&#xff0c;本节介绍虚拟网卡设备…

理解生成式AI

文章目录 1、专业术语2、生成式AI3、ChatGPT1. 理解LLMRNN循环神经网络Seq2Seq模型ChatGPT与Bert区别 4、模型的生成和部署 1、专业术语 LLM&#xff1a;大型语言模型 GAI&#xff1a;通用人工智能 NLP&#xff1a;自然语言处理 CNN&#xff1a;卷积神经网络 RNN&#xff…

Spark的安装和配置

Spark的安装和配置 推荐按照我的博客下载hadoop&#xff0c;spark&#xff0c;pyspark以及scala这样版本搭配更好。 如果觉得自己不会版本搭配可私聊博主。 先安装hadoop再安装spark scala的安装和配置&#xff1a;https://blog.csdn.net/weixin_41957626/article/details/1305…

集群session的共享问题

基于redis实现共享session登录 1.集群session共享的问题 session共享问题&#xff1a;多台Tomcat并不共享session存储空间&#xff0c;当请求切换到不同tomcat服务时导致数据丢失问题 替代方案应该满足&#xff1a; 数据共享 内存存储 key、value结构 2.基于redis实现ses…

QoS实验配置-基于类部署

目录 对路由进行优先级标记 配置端口信任DSCP优先级 配置流量监管 配置拥塞管理 配置拥塞避免 配置流量整形 出接口下应用队列模板 对配置进行检验 QoS基于类的方式实现管理&#xff08;通过调度0~7队列进行实现&#xff0c;一般6、7协议是预留给路由协议的&#xff0c…

macos和windows区别 macos怎么运行windows程序

在我们使用电脑时&#xff0c;重要的是电脑内应用&#xff0c;而系统不过是运行软件的“容器”。日常生活中&#xff0c;我们常见的操作系统是macos和windows&#xff0c;那么macos和windows区别在哪&#xff1f;这两款操作系统的区别很大。macos怎么运行windows程序&#xff1…

从I帧到B帧,H.264编码技术为您构建画面与效果完美结合的视觉盛宴

H264之帧编码 H.264&#xff0c;也称为 MPEG-4 AVC (Advanced Video Coding)&#xff0c;是一种高效的视频编码标准&#xff0c;用于压缩和存储视频。H.264 利用了预测编码和变换编码等先进的技术&#xff0c;其编码流程与普通视频编码类似&#xff0c;主要包括帧类型判定、运…

2017年下半年软件设计师下午试题

试题四 阅读下列说明和C代码&#xff0c;回答问题1至问题 2&#xff0c;将解答写在答题纸的对应栏内。 【说明】 一个无向连通图G点上的哈密尔顿&#xff08;Hamiltion&#xff09;回路是指从图G上的某个顶点出发&#xff0c;经过图上所有其他顶点一次且仅一次&#xff0c;最后…

HNU-操作系统OS-实验Lab4

OS_Lab4_Experimental report 湖南大学信息科学与工程学院 计科 210X wolf &#xff08;学号 202108010XXX&#xff09; 实验目的 了解内核线程创建/执行的管理过程了解内核线程的切换和基本调度过程 实验内容 lab2/3完成了物理和虚拟内存管理&#xff0c;这给创建内核线程…

C++之初识STL—vector

文章目录 STL基本概念使用STL的好处容器vector1.vector容器简介2.vector对象的默认构造函数3.vector对象的带参构造函数4.vector的赋值5.vector的大小6.vector容器的访问方式7.vector的插入 STL基本概念 STL(Standard Template Library,标准模板库)STL 从广义上分为: 容器(con…

springboot+vue音乐翻唱与分享平台(源码+文档)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的音乐网站与分享平台。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 &#x1f495;&#x1f495;作者&#xff1a;…

基于 FineReport 快速设计联动报表

一、基于 FineReport 快速设计联动报表 FineReport 一款用于报表制作&#xff0c;分析和展示的工具&#xff0c;可以轻松的构建出灵活的数据分析和报表系统。 下面基于 FineReport 自带的数据表 销量 表快速设计一页可视化联动报表&#xff0c;数据格式如下&#xff1a; 报表…

最新最全花1W买的Python+Selenium全栈Web自动化测试

前言&#xff1a;看这篇帖子&#xff0c;最好要在知道定位八大元素的基础之上才能够比较熟练的看完这篇帖子自动化测试是软件开发中非常重要的一环&#xff0c;它可以帮助开发人员提高代码质量、减少错误和缺陷&#xff0c;并节省测试时间。其中&#xff0c;Selenium是一个广泛…

01- 目标检测 (综述)

要点&#xff1a; 区分One-stage detector 和 Two-stage detector 参考链接&#xff1a;深度学习目标检测最全综述 - 爱码网 详细模型解读参考&#xff1a;目标检测简介 - 知乎 一 目标检测分类 1.1 发展历程 检测网络发布历程&#xff1a; 1.2 检测模型分类 2014年后目标…

7---整数反转

给你一个 32 位的有符号整数 x x x &#xff0c;返回将 x x x 中的数字部分反转后的结果。 如果反转后整数超过 32 位的有符号整数的范围 [ − 2 31 , 2 31 − 1 ] [−2^{31}, 2^{31} − 1] [−231,231−1]&#xff0c;就返回 0。 假设环境不允许存储 64 位整数&#xff08…

2017年上半年软件设计师下午试题

试题四 阅读下列说明和 C 代码&#xff0c;回答问题 1 至问题 3&#xff0c;将解答写在答题纸的对应栏内。 【说明】 假币问题&#xff1a;有 n 枚硬币&#xff0c;其中有一枚是假币&#xff0c;己知假币的重量较轻。现只有一个天平&#xff0c;要求用尽量少的比较次数找出这枚…

【编程福音,25款必备AI编码工具推荐,让你事半功倍】

&#x1f680; AI破局先行者 &#x1f680; &#x1f332; AI工具、AI绘图、AI专栏 &#x1f340; &#x1f332; 如果你想学到最前沿、最火爆的技术&#xff0c;赶快加入吧✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;CSDN-Java领域优质创作者&#x1f3c6;&am…

代码随想录算法训练营第三十四天 | 加油站题、左右贪心

1005. K次取反后最大化的数组和 文档讲解&#xff1a;代码随想录 (programmercarl.com) 视频讲解&#xff1a;贪心算法&#xff0c;这不就是常识&#xff1f;还能叫贪心&#xff1f;LeetCode&#xff1a;1005.K次取反后最大化的数组和_哔哩哔哩_bilibili 状态&#xff1a;能做出…

Hadoop的安装与配置

Hadoop的安装与配置 推荐按照我的博客下载hadoop&#xff0c;spark&#xff0c;pyspark以及scala这样版本搭配更好。 如果觉得自己不会版本搭配可私聊博主。 scala的安装和配置&#xff1a;https://blog.csdn.net/weixin_41957626/article/details/130548174 spark的安装和配置…