I'm working on an linux application incorporating ptrace to observe the threads of another process. When the application I observe forks a child process this already works quite well. By calling waitpid in my application I can obtain the following signals in the observing application:
SIGSTOPform the child processSIGTRAPfrom the parent
To keep track of all the children I setup ptrace with PTRACE_O_TRACEFORK, PTRACE_O_TRACEVFORK, PTRACE_O_TRACECLONE and PTRACE_O_TRACEEXIT.
While everything is working quite fine with child processes, I cannot observe the threads of the application. I get the SIGTRAP from the process creating the thread but I don't get any signals from the thread.
Is there anything special with threads and ptrace? How does strace keep track of threads (I could not find any special routines dedicated to threads in the code of strace)?
This is how I use ptrace in my application:
- First I attach to a process:
ptrace(PTRACE_ATTACH, pid, NULL, NULL); - Then, I call
waitpid():trace_pid = waitpid(-1, &status, 0); - Set
ptraceoptions:ptrace(PTRACE_SETOPTIONS, pid, NULL, PTRACE_O_TRACEFORK | PTRACE_O_TRACEVFORK | PTRACE_O_TRACECLONE | PTRACE_O_TRACEEXIT);
After attaching to pid I'm calling waitpid() in a loop and call ptrace(PTRACE_SETOPTIONS... for every new task reported by ptrace. Of course, I continue the tasks with SIGCONT after event handling.