Подтвердить что ты не робот

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 после обработки событий.

4b9b3361

Ответ 1

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

waitpid(-1, &status, __WALL)

вместо

waitpid(-1, &status, 0)