diff options
-rw-r--r-- | process.c | 27 | ||||
-rw-r--r-- | sctrace.c | 2 |
2 files changed, 20 insertions, 9 deletions
@@ -45,14 +45,25 @@ add_process(pid_t pid, unsigned long int trace_options) continue; eprintf_and_kill(pid, "waitpid %ju <buffer> WSTOPPED:", (uintmax_t)pid); } - if (!WIFSTOPPED(status) || WSTOPSIG(status) != SIGSTOP) - eprintf_and_kill(pid, "unexpected return of waitpid %ju <buffer> WSTOPPED:", (uintmax_t)pid); - if (ptrace(PTRACE_SEIZE, pid, 0, trace_options)) - eprintf_and_kill(pid, "ptrace PTRACE_SEIZE %ju 0 ...:", (uintmax_t)pid); - if (ptrace(PTRACE_INTERRUPT, pid, 0, 0)) - eprintf_and_kill(pid, "ptrace PTRACE_INTERRUPT %ju 0 0:", (uintmax_t)pid); - if (kill(pid, SIGCONT) < 0) - eprintf_and_kill(pid, "kill &ju SIGCONT:", (uintmax_t)pid); + + switch (status) { + case __W_STOPCODE(SIGSTOP): + if (ptrace(PTRACE_SEIZE, pid, 0, trace_options)) + eprintf_and_kill(pid, "ptrace PTRACE_SEIZE %ju 0 ...:", (uintmax_t)pid); + if (ptrace(PTRACE_INTERRUPT, pid, NULL, 0)) + eprintf_and_kill(pid, "ptrace PTRACE_INTERRUPT %ju NULL 0:", (uintmax_t)pid); + if (kill(pid, SIGCONT) < 0) + eprintf_and_kill(pid, "kill &ju SIGCONT:", (uintmax_t)pid); + break; + + case __W_STOPCODE(SIGTRAP) | (PTRACE_EVENT_STOP << 16): + if (ptrace(PTRACE_SYSCALL, pid, NULL, 0)) + eprintf_and_kill(pid, "ptrace PTRACE_SYSCALL %ju NULL 0:", (uintmax_t)pid); + break; + + default: + eprintf_and_kill(pid, "unexpected return of waitpid %ju <buffer> WSTOPPED: %#x\n", (uintmax_t)pid, status); + } return proc; } @@ -157,7 +157,7 @@ handle_event(struct process *proc, int status) abort(); case 0: - /* TODO ensure proper handling of signals (multithreaded?, siginfo?, in new processes?) */ + /* TODO ensure proper handling of signals (siginfo?) */ if (ptrace(PTRACE_GETSIGINFO, proc->pid, 0, &(siginfo_t){0})) goto stop_signal; tprintf(proc, "\nProcess received signal %i (%s: %s)\n", sig, get_signum_name(sig), strsignal(sig)); |