Я работаю над linux-приложением, включающим ptrace для наблюдения за потоками другого процесса. Когда приложение, за которым я наблюдаю, форкает дочерний процесс, это уже работает достаточно хорошо. Вызвав waitpid в моем приложении, я могу получить следующие сигналы в наблюдающем приложении:
SIGSTOP
от дочернего процессаSIGTRAP
от родительскогоДля отслеживания всех дочерних процессов я настроил ptrace с помощью PTRACE_O_TRACEFORK
, PTRACE_O_TRACEVFORK
, PTRACE_O_TRACECLONE
and PTRACE_O_TRACEEXIT
.
В то время как с дочерними процессами все работает нормально, я не могу наблюдать за потоками приложения. Я получаю SIGTRAP
от процесса, создающего поток, но не получаю никаких сигналов от потока.
Есть ли что-то особенное с потоками и ptrace
? Как strace
отслеживает потоки (в коде strace
я не нашел никаких специальных процедур, посвященных потокам)?
Вот как я использую ptrace
в своем приложении:
ptrace(PTRACE_ATTACH, pid, NULL, NULL);
waitpid()
: trace_pid = waitpid(-1, &status, 0);
ptrace
: ptrace(PTRACE_SETOPTIONS, pid, NULL, PTRACE_O_TRACEFORK | PTRACE_O_TRACEVFORK | PTRACE_O_TRACECLONE | PTRACE_O_TRACEEXIT);
После присоединения к pid я вызываю waitpid()
в цикле и вызываю ptrace(PTRACE_SETOPTIONS....
для каждой новой задачи, о которой сообщает ptrace
. Конечно, я продолжаю выполнение задач с SIGCONT
после обработки событий.