Il existe un appel système nommé ptrace. Il prend 4 paramètres :l'opération, le PID du processus cible, une adresse dans la mémoire du processus cible et un pointeur de données. La façon dont les 2 derniers paramètres sont utilisés dépend de l'opération.
Par exemple, vous pouvez attacher/détacher votre débogueur à un processus :
ptrace(PTRACE_ATTACH, pid, 0, 0);
...
ptrace(PTRACE_DETACH, pid, 0, 0);
Exécution en une seule étape :
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);
Vous pouvez également lire/écrire la mémoire du processus cible avec PTRACE_PEEKDATA et PTRACE_POKEDATA. Si vous voulez voir un exemple réel, consultez gdb.