Как использовать PTRACE, чтобы получить согласованное представление о нескольких потоках?

Пока я работалпо этому вопросуЯмы натолкнулись на возможную идею, которая используетptrace, но я'я не могу получить правильное понимание того, какptrace взаимодействует с потоками.

Предположим, у меня есть заданный многопоточный основной процесс, и я хочу присоединиться к определенному потоку в нем (возможно, из разветвленного потомка).

Могу ли я прикрепить к определенной теме? (Руководства расходятся по этому вопросу.)

Если так, значит ли это, что пошаговое выполнение только одного шагаинструкции? Останавливает ли это весь процесс?с темы?

Если это так, все остальные темы остаются остановленными, пока я вызываюPTRACE_SYSCALL или жеPTRACE_SINGLESTEPили сделатьвсе темы продолжаются? Есть ли способ сделать шаг вперед только в одном потоке, но гарантировать, что остальные потоки останутся остановленными?

По сути, я хочу синхронизировать исходную программу, заставляя все потоки остановиться, а затем выполнить только небольшой набор однопоточных инструкций, пошагово пошагово отслеживая один поток.

Мои личные попытки пока выглядят примерно так:

pid_t target = syscall(SYS_gettid);   // get the calling thread's ID
pid_t pid = fork();

if (pid > 0)
{
    waitpid(pid, NULL, 0);            // synchronise main process

    important_instruction();
}
else if (pid == 0)
{
    ptrace(target, PTRACE_ATTACH, NULL, NULL);    // does this work?

    // cancel parent's "waitpid" call, e.g. with a signal

    // single-step to execute "important_instruction()" above

   ptrace(target, PTRACE_DETACH, NULL, NULL);     // parent's threads resume?

   _Exit(0);
}

Однако я'Я не уверен, и могуне найти подходящих ссылок, что это одновременно правильно и чтоimportant_instruction() гарантированно выполняется только тогда, когда все остальные потоки остановлены. Я также понимаю, что могут быть условия гонки, когда родитель получает сигналы из других мест, и я слышал, что я должен использоватьPTRACE_SEIZE вместо этого, но это некажется, существует повсюду.

Любые разъяснения или ссылки будут с благодарностью!

Ответы на вопрос(4)

Ваш ответ на вопрос