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_SINGLESTEP
ou 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!