Как использовать 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 вместо этого, но это, кажется, не существует везде.

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

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

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