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).
-
Kann lege ich auf einen bestimmten thread? (Die Handbücher abweichen, auf diese Frage.)
-
Wenn dem so ist, bedeutet das, dass Einzelschritt nur wenige Schritte durch, dass ein thread die Anweisungen? Hört es alle, den Prozess-threads?
-
Wenn ja, haben alle anderen threads beendet bleiben, während ich call
PTRACE_SYSCALL
oderPTRACE_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!
Du musst angemeldet sein, um einen Kommentar abzugeben.
Jedem thread im Prozess verfolgt wird, individuell (und jeder kann möglicherweise verfolgt von einem anderen tracing-Prozess, oder nicht verfolgten). Wenn Sie call ptrace befestigen, Sie sind immer die Befestigung an nur einem einzigen thread. Nur, dass thread beendet - die anderen threads weiter ausgeführt wird, wie Sie waren.
Letzten Versionen der
ptrace()
Mann Seite machen dies sehr deutlich:Single-stepping betrifft nur den thread, dass Sie leiten Sie an. Wenn die anderen threads ausgeführt werden, die Sie laufen weiter, und wenn Sie die Ablaufverfolgung beenden, bleiben Sie in der Ablaufverfolgung zu stoppen. (Dies bedeutet, dass, wenn der Faden, den Sie single-stepping versucht, erwerben Sie einen mutex oder eine ähnliche synchronisation Ressource, die gehalten wird von einem anderen nicht-Laufenden thread, es wird nicht in der Lage sein zu erwerben, die mutex).
Wenn Sie wollen, zu stoppen alle threads des Prozesses, während Sie ein-Schritt-ein thread wird, müssen Sie zu befestigen, um alle threads. Gibt es die zusätzliche Komplikation, dass, wenn der Prozess ausgeführt wird, während Sie versuchen, legen Sie es, neue threads erstellt werden könnte, während Sie aufzählen Ihnen.
SYS_gettid
zeigte, wie Sie sich selbst, oder durch die Suche in/proc/<pid>/task/
über einen Eintrag für jeden thread in den Prozess. Die thread-ID ist gleich der Prozess-ID für den ersten thread in der Prozess - Befestigung an legt es nur zu, dass die ursprünglichen thread. Es ist nicht möglich, Sie zu befestigen, um den ganzen Prozess - pthread-Befehle sind immer richtet sich an einen einzelnen thread.Ja
Es folgt der Prozess, der alle threads dieses Prozesses sind zu stoppen.
Es sich vorstellen, es war nicht, wie könnten Sie das dirfferent thread in Ihre IDE.
aus der Anleitung:
Beispiel-code anzuhängen:
Also ja, Sie sind atached für einen thread, und ja, es Stoppt alle threads des Prozesses.
vielleicht finden Sie hier : http://www.secretmango.com/jimb/Whitepapers/ptrace/ptrace.html