我想只跟踪系统调用的C程序的一部分。我正在使用带有PTRACE_TRACEME选项的ptrace()来开始跟踪。如何在几行代码后停止跟踪此过程。我正在尝试使用PTRACE_DETACH,但它不起作用?
主.C文件是:
#include<stdio.h>
#include<unistd.h>
#include<sys/ptrace.h>
#include<signal.h>
int display(char *p);
int main()
{
puts("Before Display\n");
display("hello");
puts("After Display\n");
return 0;
}
int display(char *p)
{
ptrace(PTRACE_TRACEME, 0, NULL, NULL);
raise(SIGCONT);
puts("interception");
ptrace(PTRACE_DETACH, 0, NULL, NULL);
return 0;
}
父进程的代码是:
#include <sys/ptrace.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <sys/reg.h> /* For constants ORIG_EAX etc */
#include <stdio.h>
int main()
{ pid_t child;
int status;
long orig_eax;
child = fork();
if(child == 0)
{
execl("/home/kashi/Documents/write", "write", NULL);
}
else {
while(1)
{
wait(&status);
if(WIFEXITED(status))
break;
orig_eax = ptrace(PTRACE_PEEKUSER,
child, 4 * ORIG_EAX,
NULL);
printf("The child made a "
"system call %ld\n", orig_eax);
ptrace(PTRACE_SYSCALL, child, NULL, NULL);
}
}
return 0;
}
答案 0 :(得分:2)
您无法从跟踪过程中执行此操作。
PTRACE_TRACEME
是在跟踪过程中有意义的唯一请求。 PTRACE_DETACH
以及所有其他必须在跟踪过程中使用。
tracee可以与示踪剂通信并礼貌地要求它分离。没有专门针对此的ptrace
请求。例如,tracee可以是raise(SIGCONT)
,跟踪器会观察它并发出PTRACE_DETACH
。