Pourquoi WIFSIGNALED (status) ne parvient-il pas à détecter les signaux lors du traçage d’un processus avec ptrace?

J’utilise ptrace pour suivre un processus enfant. Cela fonctionne parfaitement bien lorsque le processus enfant se termine normalement. Mais s’il se termine anormalement, le programme entre dans une boucle infinie malgré l’utilisation de la macro WIFSIGNALED (& status). Voici un exemple de processus enfant:

try.c

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

Et voici le programme de recherche

 #include  #include  #include  #include  #include  #include  /* For SYS_write etc */ #include  #include  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; } 

Pourquoi le signal n’est pas détecté, ce qui fonctionne sinon lorsque ptrace n’est pas utilisé?

Lorsque vous tracez un processus, wait retournera tout changement d’état. L’une d’elles est lorsque le processus est sur le sharepoint recevoir un signal. Votre attente reviendra avant que le signal ne soit transmis à l’enfant. Vous devez utiliser PTRACE_CONT pour permettre au signal d’être transmis à l’enfant, si c’est ce que vous voulez qu’il se produise.

Pourquoi ça marche comme ça? Rappelez-vous que le but principal de ptrace est d’être utilisé dans l’implémentation de débogueurs. Si vous n’avez pas eu l’occasion d’intercepter des signaux tels que SIGSEGV , le débogueur ne pourrait pas s’arrêter et vous permettre d’examiner la faute de segment avant que le processus ne soit interrompu.