Es gibt einen Systemaufruf namens ptrace. Es benötigt 4 Parameter:die Operation, die PID des Zielprozesses, eine Adresse im Speicher des Zielprozesses und einen Datenzeiger. Die Art und Weise, wie die letzten 2 Parameter verwendet werden, hängt von der Operation ab.
Beispielsweise können Sie Ihren Debugger an einen Prozess anhängen/abtrennen:
ptrace(PTRACE_ATTACH, pid, 0, 0);
...
ptrace(PTRACE_DETACH, pid, 0, 0);
Einzelschrittausführung:
ptrace(PTRACE_ATTACH, pid, 0, 0);
int status;
waitpid(pid, &status, WSTOPPED);
while (...) {
ptrace(PTRACE_SINGLESTEP, pid, 0, 0);
// give the user a chance to do something
}
ptrace(PTRACE_DETACH, pid, 0, 0);
Sie können den Speicher des Zielprozesses auch mit PTRACE_PEEKDATA und PTRACE_POKEDATA lesen/schreiben. Wenn Sie ein echtes Beispiel sehen möchten, schauen Sie sich gdb an.