ptrace(),如何在子进程中停止跟踪?

时间:2014-07-04 11:26:10

标签: c linux gcc ptrace

我想只跟踪系统调用的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;
}

1 个答案:

答案 0 :(得分:2)

您无法从跟踪过程中执行此操作。

PTRACE_TRACEME是在跟踪过程中有意义的唯一请求。 PTRACE_DETACH以及所有其他必须在跟踪过程中使用。

tracee可以与示踪剂通信并礼貌地要求它分离。没有专门针对此的ptrace请求。例如,tracee可以是raise(SIGCONT),跟踪器会观察它并发出PTRACE_DETACH