Почему WIFSIGNALED (статус) не может обнаружить сигналы при отслеживании процесса с помощью ptrace? - PullRequest
1 голос
/ 18 сентября 2011

Я использую ptrace для отслеживания дочернего процесса. Он прекрасно работает, когда дочерний процесс завершается нормально. Но если он выйдет ненормально, программа попадет в бесконечный цикл, несмотря на использование макроса WIFSIGNALED (& status). Вот пример дочернего процесса:

try.c

int main()
   {
      int a=5/0;
   }

А вот и программа трассировки

#include <sys/ptrace.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <sys/user.h>
#include <sys/syscall.h>   /* For SYS_write etc */
#include <sys/reg.h>
#include <signal.h>
int main()
{   
    pid_t child;
    long orig_eax, eax;
    int status,insyscall = 0;
    child = fork();
    if(child == 0)
    {
            ptrace(PTRACE_TRACEME, 0, NULL, NULL);
            execl("./try", "try", NULL);
    }
    else
    {
        siginfo_t sig;
        memset(&sig,0,sizeof(siginfo_t));
        while(1)
        {
            wait(&status);
            if(WIFSIGNALED(status))
            {
                printf("Exiting due to signal\n");
                exit(0);
            }
            if(WIFEXITED(status))
                break;
            orig_eax = ptrace(PTRACE_PEEKUSER,child, 4 * ORIG_EAX, NULL);
            printf("system call number=%ld\n",orig_eax);
            if(insyscall == 0)
            {
                      /* Syscall entry */
                      insyscall = 1;
                      printf("In sys call\n");
            }
            else 
            {
               /* Syscall exit */
                 eax = ptrace(PTRACE_PEEKUSER,child, 4 * EAX, NULL);
                 printf("System call returned with %ld\n", eax);
                 insyscall = 0;
             }
            ptrace(PTRACE_SYSCALL,child, NULL, NULL);
        }
    }
    return 0;
}

Почему не обнаруживается сигнал, который в противном случае работает, если ptrace не используется?

1 Ответ

3 голосов
/ 18 сентября 2011

Когда вы выполняете процесс, ожидание вернется к любому изменению состояния.Одним из них является то, когда процесс собирается получить сигнал.Ваше ожидание вернется до того, как сигнал будет доставлен ребенку.Вам нужно использовать PTRACE_CONT, чтобы разрешить доставку сигнала ребенку, если вы хотите, чтобы это произошло.

Почему это работает так?Хорошо помните, что главная цель ptrace - использовать его для реализации отладчиков.Если у вас не было возможности перехватить такие сигналы, как SIGSEGV, отладчик не сможет остановиться и позволить вам изучить ошибку сегмента до того, как процесс будет остановлен.

...