Ptrace и темы - PullRequest
       39

Ptrace и темы

14 голосов
/ 03 сентября 2011

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

1 Ответ

13 голосов
/ 03 сентября 2011

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

waitpid(-1, &status, __WALL)

вместо

waitpid(-1, &status, 0)
...