Я работаю над приложением 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
после обработки события.