Hay una llamada al sistema llamada ptrace. Toma 4 parámetros:la operación, el PID del proceso de destino, una dirección en la memoria del proceso de destino y un puntero de datos. La forma en que se usan los últimos 2 parámetros depende de la operación.
Por ejemplo, puede adjuntar/separar su depurador a un proceso:
ptrace(PTRACE_ATTACH, pid, 0, 0);
...
ptrace(PTRACE_DETACH, pid, 0, 0);
Ejecución de un solo paso:
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);
También puede leer/escribir la memoria del proceso de destino con PTRACE_PEEKDATA y PTRACE_POKEDATA. Si desea ver un ejemplo real, consulte gdb.