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