Como usar o PTRACE para obter uma visão consistente de vários segmentos?

Enquanto eu estava trabalhandosobre esta questão, Eu me deparei com uma ideia possível que usaptrace, mas não consigo entender bem comoptrace interage com threads.

Suponha que eu tenha um determinado processo principal multissegmentado e desejo anexar a um segmento específico nele (talvez de um filho bifurcado).

Posso anexar a um segmento específico? (Os manuais divergem nesta questão.)

Em caso afirmativo, isso significa que apenas um passo percorre as instruções desse segmento? Interrompe todos os threads do processo?

Se assim for, todos os outros threads permanecem parados enquanto eu ligoPTRACE_SYSCALL ouPTRACE_SINGLESTEPou fazertodos tópicos continuam? Existe uma maneira de avançar somente em um único thread, mas garantir que os outros threads permaneçam interrompidos?

Basicamente, eu quero sincronizar o programa original forçando todos os threads a parar, e então apenas executar um pequeno conjunto de instruções single-threaded dando um único passo no único thread rastreado.

Minhas tentativas pessoais até agora parecem um pouco com isso:

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);
}

No entanto, não tenho certeza e não consigo encontrar referências adequadas, que isso seja correntemente correto e queimportant_instruction() é garantido para ser executado somente quando todos os outros threads estão parados. Eu também entendo que pode haver condições de corrida quando o pai recebe sinais de outro lugar, e eu ouvi que eu deveria usarPTRACE_SEIZE em vez disso, mas isso não parece existir em todos os lugares.

Qualquer esclarecimento ou referências seria muito apreciado!

questionAnswers(4)

yourAnswerToTheQuestion