ptrace
Observa e controla a execução de outro processo — a base de depuradores e do strace.
Descrição
Permite a um processo ('tracer') inspecionar e modificar a memória, os registradores e o fluxo de execução de outro ('tracee'), e interceptar chamadas de sistema e sinais que ele recebe. É a fundação de `gdb`, `strace`, `ltrace` e de mecanismos de sandboxing baseados em interceptação de syscalls.
sys/ptrace.hman 2Atenção
Um processo só pode ter um tracer por vez. `PTRACE_ATTACH`/`PTRACE_SEIZE` a um processo que já está sendo tracejado falha com EPERM.
Nota
O acesso é restrito por `yama.ptrace_scope` no Linux moderno (Yama LSM), que por padrão bloqueia tracing de processos não-descendentes mesmo com as permissões Unix corretas.
Assinatura
long ptrace(
enum __ptrace_request request,
pid_t pid,
void * addr,
void * data
);Parâmetros
| Parâmetro | Tipo | Descrição |
|---|---|---|
| request | enum __ptrace_request | Operação a executar: PTRACE_TRACEME, PTRACE_PEEKTEXT, PTRACE_POKETEXT, PTRACE_CONT, PTRACE_SYSCALL, PTRACE_GETREGS, PTRACE_ATTACH, PTRACE_SEIZE, entre outras. |
| pid | pid_t | PID do processo tracee (ignorado para PTRACE_TRACEME). |
| addr | void * | Endereço na memória do tracee, quando aplicável ao `request`. |
| data | void * | Dado ou ponteiro de saída, cujo significado depende do `request`. |
Registradores (x86_64)
| Registrador | Papel | Argumento |
|---|---|---|
| rax | número da syscall (chamada) / valor de retorno (após SYSCALL) | — |
| rdi | argumento 1 | requestenum __ptrace_request |
| rsi | argumento 2 | pidpid_t |
| rdx | argumento 3 | addrvoid * |
| r10 | argumento 4 | datavoid * |
Valor de retorno
Depende do `request`: normalmente 0 em sucesso, mas alguns pedidos (ex.: PTRACE_PEEK*) retornam o próprio dado lido. -1 em erro, com errno definido — atenção: -1 também pode ser um valor de dado legítimo, por isso `errno` deve ser zerado antes da chamada nesses casos.
Códigos de erro (errno)
- ESRCH(3)
- Processo inexistente.
- EPERM(1)
- Operação não permitida (falta de privilégio).
- EIO(5)
- Erro de E/S físico.
- EFAULT(14)
- Endereço de memória inválido (ponteiro fora do espaço de endereçamento válido).
- EINVAL(22)
- Argumento inválido.
- EBUSY(16)
- Dispositivo ou recurso ocupado.