Я работаю над приложением linux, включающим ptrace для наблюдения за потоками другого процесса.Когда приложение, которое я наблюдаю, разветвляется на дочерний процесс, это уже работает довольно хорошо.Вызвав waitpid в моем приложении, я могу получить следующие сигналы в приложении наблюдения:
SIGSTOP
от дочернего процесса SIGTRAP
от родителя
Чтобы отслеживать все дочерние элементы, я установил ptrace с помощью PTRACE_O_TRACEFORK
, PTRACE_O_TRACEVFORK
, PTRACE_O_TRACECLONE
и 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
после обработки события.