ptrace и потоки

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


person mupro    schedule 02.09.2011    source источник
comment
Я думаю, что немного приблизился к сути проблемы: когда создается новый поток, я даже не получаю sigstop в процессе наблюдения. Однако в документации ptrace сказано: автоматически запускать трассировку только что клонированного процесса, который начнется с SIGSTOP. Как это может произойти?   -  person mupro    schedule 03.09.2011
comment
Я провел небольшое дополнительное исследование, используя procfs и небольшое приложение, использующее потоки posix. Все, что делает приложение, это запускает новый поток и некоторое время спит. Новый поток также спит в течение нескольких секунд. Как я уже сказал, я не получу sigstop с waitpid для нового потока. Однако файл состояния в procfs для нового потока говорит мне: Имя: thread_test Состояние: t (остановка трассировки) Tgid: 2538 Pid: 2545 PPid: 2395 TracerPid: 2540 Итак, новый поток остановлен, но waitpid не получает сигнал остановки . Каков правильный способ отслеживания потоков?   -  person mupro    schedule 03.09.2011


Ответы (1)


Наконец, я сам нашел решение: я получил сигналы от всех потоков, вызвав

waitpid(-1, &status, __WALL)

вместо

waitpid(-1, &status, 0)
person mupro    schedule 03.09.2011