ptrace и потоки

Я работаю над linux-приложением, включающим ptrace для наблюдения за потоками другого процесса. Когда приложение, за которым я наблюдаю, форкает дочерний процесс, это уже работает достаточно хорошо. Вызвав waitpid в моем приложении, я могу получить следующие сигналы в наблюдающем приложении:

  • SIGSTOP от дочернего процесса
  • SIGTRAP от родительского

Для отслеживания всех дочерних процессов я настроил ptrace с помощью PTRACE_O_TRACEFORK, PTRACE_O_TRACEVFORK, PTRACE_O_TRACECLONE and 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 после обработки событий.

14
задан perror 22 August 2013 в 07:56
поделиться