¿Cómo utilizar PTRACE para obtener una vista coherente de varios subprocesos?

Mientras trabajabaen esta pregunta, Me he topado con una posible idea que utilizaptrace, pero soy incapaz de obtener una comprensión adecuada de cómoptrace Interactúa con los hilos.

Supongamos que tengo un proceso principal dado, multiproceso, y quiero unirlo a un hilo específico (tal vez de un niño bifurcado).

¿Puedo adjuntar a un hilo específico? (Los manuales divergen en esta pregunta).

Si es así, ¿significa eso que solo paso a paso solo pasa por las instrucciones de ese hilo? ¿Detiene todos los hilos del proceso?

Si es así, todos los otros hilos permanecen detenidos mientras llamoPTRACE_SYSCALL oPTRACE_SINGLESTEPo hacertodos continuar los hilos? ¿Hay una manera de avanzar solo en un solo hilo pero garantizar que los otros hilos permanezcan detenidos?

Básicamente, quiero sincronizar el programa original forzando a todos los subprocesos a detenerse, y luego solo ejecutar un pequeño conjunto de instrucciones de un solo subproceso dando un paso de un solo subproceso.

Mis intentos personales hasta ahora se ven un poco así:

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

Sin embargo, no estoy seguro, y no puedo encontrar referencias adecuadas, que esto es al mismo tiempo correcto y queimportant_instruction() se garantiza que se ejecutará solo cuando todos los otros subprocesos estén detenidos. También entiendo que puede haber condiciones de carrera cuando el padre recibe señales de otro lugar, y escuché que debería usarPTRACE_SEIZE en cambio, pero eso no parece existir en todas partes.

Cualquier aclaración o referencia sería muy apreciada!

Respuestas a la pregunta(4)

Su respuesta a la pregunta