Ответ 1
Наконец, я нашел решение самостоятельно: я получил сигналы от всех потоков, позвонив
waitpid(-1, &status, __WALL)
вместо
waitpid(-1, &status, 0)
Я работаю над приложением 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
после обработки событий.
Наконец, я нашел решение самостоятельно: я получил сигналы от всех потоков, позвонив
waitpid(-1, &status, __WALL)
вместо
waitpid(-1, &status, 0)