aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--process.c27
-rw-r--r--sctrace.c2
2 files changed, 20 insertions, 9 deletions
diff --git a/process.c b/process.c
index 056a103..f979e21 100644
--- a/process.c
+++ b/process.c
@@ -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;
}
diff --git a/sctrace.c b/sctrace.c
index 30535fb..f86d830 100644
--- a/sctrace.c
+++ b/sctrace.c
@@ -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));