为什么WIFSIGNALED(状态)在使用ptrace跟踪进程时无法检测到信号?

我正在使用ptrace来跟踪子进程。 当子进程正常退出时,它可以很好地工作。 但是如果它exception退出,程序就会进入无限循环,尽管使用宏WIFSIGNALED(&status)。 这是示例子进程:

try.c

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

这是追踪计划

 #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; } 

为什么没有检测到信号,否则在没有使用ptrace时会有效?

当您进行某个进程时,等待将返回任何状态更改。 其中之一是当过程即将接收信号时。 您的等待将信号传递给孩子之前返回。 您需要使用PTRACE_CONT来将信号传递给孩子,如果这是您想要发生的事情。

为什么这样工作? 记住,ptrace的主要目的是用于实现调试器。 如果您没有机会拦截SIGSEGV等信号,调试器就无法停止,让您在拆除进程之前检查seg故障。