2013-12-07 4 views
0

Я пытаюсь использовать ptrace, чтобы поймать идентификатор системного вызова дочернего процесса, например execve (11) или fork (2).Как системный вызов ptrace catch fork?

мой код здесь.

#include <sys/syscall.h> 
#include <sys/reg.h> 
#include <sys/ptrace.h> 
#include <sys/wait.h> 
#include <unistd.h> 
#include <stdio.h> 

int main(){ 
    pid_t pid; 
    if ((pid = fork()) == 0){ 
     ptrace(PTRACE_TRACEME, 0, NULL, NULL); 
     pid_t t = fork(); 
    } else{ 
     int status; 
     struct rusage resource; 
     while (true){ 
      wait4(pid, &status, 0, &resource); 
      if (WIFEXITED(status)) break; 
      int syscall = ptrace(PTRACE_PEEKUSER, pid, 4 * ORIG_EAX, NULL); 
      if (syscall == SYS_execve) printf("%d\n", syscall); 
      ptrace(PTRACE_SYSCALL, pid, NULL, NULL); 
     } 
    } 
    return 0; 
} 

На мой взгляд, программа должна напечатать «2» на экране (поскольку системный вызов «вилка» идентификатор 2), но я ничего не получил после завершения программы. Может кто-нибудь объяснить мне об этом?

+1

Подождите, так что вы разыгрываете *, ожидая, пока ребенок закончит *, проследив его * после того, как он закончит *, а затем удивлен 'ptrace' не показывает его forking? – cHao

+0

Это моя вина. код «ptrace (PTRACE_TRACEME, 0, NULL, NULL)»; следует добавить. Я хочу поймать системный вызов fork, когда «pid_t t = fork()». казнены. – mengpq

ответ

1

Если ваша программа завершилась нормально, то

if (WIFEXITED(status)) break; 

это утверждение могло вызвать печать не 2, как она принимает его из петли.

См. Это заявление.

+0

извините за свою ошибку. «ptrace (PTRACE_TRACEME, 0, NULL, NULL)»; должен быть добавлен в программу. Когда «pid_t t = fork()» выполняется, функция wait4() не блокирует родительский процесс, а затем я использую «ptrace (PTRACE_PEEKUSER, pid, 4 * ORIG_EAX, NULL)»; для получения системного вызова. – mengpq

Смежные вопросы