我正在尝试在Linux CentOS上编写一个工具来跟踪所有生成的进程以及运行的内容.本质上,我有兴趣走所有的fork /克隆并从中发出所有的命令行execve()
.Strace已经(某些)这样做了,但它也截断了调用和参数.我也想更好地了解它是如何ptrace()
工作的.
因此,第一个障碍是弄清楚如何使用ptrace()
走一个分支/克隆而不需要跟踪程序需要分叉自己的副本.我挖了进来,发现了这个怎么样.由于fork是在Linux上使用clone实现的,所以我注意到strace将一些比特放入克隆系统调用中,以便在没有任何额外麻烦的情况下启用子跟踪.
所以,本质上代码只是一个大问题:
while (1) {
int pid = wait3(-1,...);
/* process what happened */
ptrace(PTRACE_SYSCALL, pid,...);
}
Run Code Online (Sandbox Code Playgroud)
这适用于相对简单的进程/bin/sh
,但是,某些进程导致wait()
无限期挂起.我唯一能够确定的是,我正在追踪的过程就是sys_rt_sigsuspend()
在它的孩子身上执行(因此,追踪者的孙子),然后是楔形物.
我很好奇是否有一种理智的方式可以调试可能发生的事情.有些事情显然阻止了流程树的进展
这是有问题的程序的源代码:
#include <sys/ptrace.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
/* For the clone flags
*/
#include <sched.h>
/* #include <errno.h> */
#include <sys/ptrace.h>
#include <sys/user.h>
/* Defines our syscalls like
*/
#include <sys/syscall.h>
#include <sys/reg.h>
#include <stdio.h>
#include <signal.h>
#include <ctype.h>
#include …
Run Code Online (Sandbox Code Playgroud)