Wie zu verwenden PTRACE, um eine konsistente Sicht auf mehrere threads??

Während ich arbeiten war auf diese Frage, ich bin gekommen, über eine mögliche Idee, die verwendet ptrace, aber ich bin nicht in der Lage zu bekommen ein gutes Verständnis, wie ptrace interagiert mit threads.

Angenommen ich habe gegeben, Multithread-main-Prozess, und ich möchte anfügen an einen bestimmten thread in dem es (vielleicht aus einer Gabel Kind).

  1. Kann lege ich auf einen bestimmten thread? (Die Handbücher abweichen, auf diese Frage.)

  2. Wenn dem so ist, bedeutet das, dass Einzelschritt nur wenige Schritte durch, dass ein thread die Anweisungen? Hört es alle, den Prozess-threads?

  3. Wenn ja, haben alle anderen threads beendet bleiben, während ich call PTRACE_SYSCALL oder PTRACE_SINGLESTEP oder tun alle threads weiter? Gibt es eine Möglichkeit, einen Schritt vorwärts, nur in einem einzigen thread, aber garantieren, dass die anderen threads beendet bleiben?

Im Grunde, ich will synchronisieren Sie die original-Programm, indem Sie erzwingen, dass alle threads zu stoppen, und dann nur ausführen, eine kleine Gruppe von single-threaded-Anweisungen, die von single-stepping die man verfolgt-thread.

Meine persönlichen versuche so weit sehen ein bisschen aus wie diese:

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

Allerdings bin ich mir nicht sicher, und kann nicht finden die passenden Verweise, dass dies gleichzeitig-korrekt ist, und dass important_instruction() ist garantiert nur ausgeführt werden, wenn alle anderen threads beendet sind. Ich verstehe auch, dass es race-conditions, wenn die parent-empfängt die Signale von woanders, und ich hörte, dass ich verwenden soll PTRACE_SEIZE statt, aber das scheint nicht zu existieren, überall.

Erläuterungen oder Hinweise wäre sehr dankbar!

InformationsquelleAutor Kerrek SB | 2013-09-02
Schreibe einen Kommentar