When bad things happen, like… ‘strace -f’ or ‘gdb’ or any other process inspection tool decides to hang your precious processes (they show up in state T in process lists), there’s always help:
#include <sys/ptrace.h> #include <signal.h> main(int ac, char **av) { int pid; if (ac>1) pid=atoi(av[1]); ptrace(PTRACE_ATTACH,pid,0,0); ptrace(PTRACE_DETACH,pid,0,0); kill(pid, SIGCONT); }
There was an issue on rhel4 where if a tracing process didn’t call ptrace detach that the thread group leader would stay in traced state. If someone sent it a SIGCONT the thread group leader would continue and all the child threads would go into a traced state (T in ps). A second SIGCONT would bring it back to normal. Between the two signals a ps ax would show only the thread group leader status. Be sure to check the threads in ps to make sure none of them are in a traced state.
A Perl/Python version of this would be easier to use.
Mark, there’s no easy syscall/ptrace module either in perl nor python nor php. ‘make a’ works though :-)