¿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_SINGLESTEP
o 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!