Linux 从GDB谈进程跟踪
来源:互联网 发布:淘宝罗技那家店是正品 编辑:程序博客网 时间:2024/06/08 17:28
进程跟踪的系统调用是ptrace(),通过ptrace,一个进程可以动态的读写另一个进程的内存和寄存器,包括数据段、代码段、堆栈以及所有的寄存器。从概念上来说,着似乎也是进程间通信的一种方法。但实际上,这种通信是单方面的,被跟踪的进程并不知道自己是在收到控制和监视的条件下进行。从这个角度来说,这又不属于进程间通信。
ptrace格式:
Int ptrace(int request,//具体操作
int pid,
int addr,//操作目标的地址
int data)
request参数是由若干宏组成的。比如使用GDB的时候,给出的宏是PTRACE_ATTACH,也就是“attach”到被跟踪进程,之后使用各种操作来读写。这里的addr就是其地址。或者通过PTRACE_SINGLESTEP、PTRACE_KILL等来控制被跟踪进程的运行,最后通过PTRACE_DETACH脱离进程跟踪关系。
#define PTRACE_TRACEME 0
#define PTRACE_PEEKTEXT 1
#define PTRACE_PEEKDATA 2
#define PTRACE_PEEKUSR 3
#define PTRACE_POKETEXT 4
#define PTRACE_POKEDATA 5
#define PTRACE_POKEUSR 6
#define PTRACE_CONT 7
#define PTRACE_KILL 8
#define PTRACE_SINGLESTEP 9
#define PTRACE_ATTACH 0x10
#define PTRACE_DETACH 0x11
#define PTRACE_SYSCALL 24
与其他系统调用一样,ptrace()在内核的实现是sys_ptrace()。
跟踪有两种情况,一种是进程主动请求跟踪,还有一种是被跟踪进程本来就是跟踪进程通过fork和exec启动的(比如GDB)。所以在函数开头的时候会if检测,这次跟踪是不是主动请求的跟踪,如果是就在该进程修改标志位。
接下来就根据参数pid找到其task_struct。不过,一号进程init()是不允许被跟踪的,同时也不能够跟踪自己。
找到task_struct后会修改其所在页面的使用计数。原因是有些操作可能会发生进程调度,为了防止子进程得到机会先运行并且exit()释放task_struct页面。
如果两个进程主动请求跟踪,但是两个进程不属于一个用户组,那就要将当前进程提到特权用户才行。此外,一个进程不能够被多个进程跟踪。所以在这里还得再检测一下。
父进程存在着生父和养父之分,养父平常和生父指向同一个进程。但是在存在跟踪的情况下,养父就是“跟踪者”,接下来就会对养父进行修改。
在读取被跟踪进程物理页面的时候,为了保证数据正确,会将被跟踪的子进程的状态置于TASK_STOP,实现原子操作。
一般来说,读取被跟踪进程的用户空间和系统空间方法是不一样的,跟踪进程只能说在用户空间下跟踪。也就是说不能够读取被跟踪者的系统空间。为了读取被跟踪者的系统空间里的信息,就要进行一个软中断。在日常的GDB下,我们在编译的时候总要-g。这个-g就是为处理一个SIGTRAP信号做准备。
- Linux 从GDB谈进程跟踪
- gdb跟踪调试内核从start_kernel到init进程启动
- Linux内核分析之三——使用gdb跟踪调试内核从start_kernel到init进程启动
- gdb调试跟踪多进程
- 使用gdb跟踪调试内核从start_kernel到init进程启动
- linux strace 进程跟踪
- linux strace 进程跟踪
- Linux--- 进程跟踪手段
- linux 进程跟踪
- linux gdb 进程调试
- 用GDB跟踪fork创建父进程和子进程
- 通过gdb跟踪进程调度分析进程切换的过程
- [zhuan]Linux下GDB调试跟踪工具
- 使用gdb跟踪Linux内核启动过程
- Linux下GDB调试跟踪工具
- 利用GDB跟踪分析linux内核启动
- GDB跟踪调试linux-3.18.6内核
- Linux strace 跟踪进程信息
- linux下如何安装配置redis及主从配置
- hdoj1059 Dividing(多重背包+二进制化简)
- 算法课第15周第1题—— 416. Partition Equal Subset Sum
- C++第7次实验(提高班)—继承和派生(参考答案)
- 微软大楼的设计方案(解题报告)
- Linux 从GDB谈进程跟踪
- Hbase的配置问题
- Python正态性检验
- 数据库JDBC连接总结(一)
- Redis安装异常解决办法
- sublime text3 安装、配置sftp插件
- Java gui练习
- 1303: [CQOI2009]中位数图
- 论程序员的时代焦虑与焦虑的缓解