Eu entendo que o comando strace
usa ptrace(PTRACE_PEEKUSER, child, __builtin_offsetof(struct user, regs.orig_eax))
para encontrar o índice de uma chamada de sistema em que o filho de tracee está preso. Então, para traduzir o índice para o nome da função syscall, ele construiu tabelas feitas a partir do grepping dos cabeçalhos do código fonte do linux presentes na instalação.
Este método deve ser não documentado e propenso a falhas, pois a localização e a sintaxe das declarações do código-fonte não são documentadas, devem ser encontradas pelo grepping e podem ser alteradas de maneiras desconhecidas. Estou correto em dizer isso?
Se é assim, então porque strace
não usa o seguinte método, parece-me, é mais simples, depende apenas de documentação e é, assim, infalível.
No início da primeira execução após a reinicialização, strace
envia um syscall de teste, um para cada função syscall, intercepta isso e observa qual índice syscall esse filho usa. Isso fornece uma tabela customizada completa e correta que pode ser armazenada em um arquivo conhecido para invocações adicionais de strace
.
Estou certo de que este método deve ter sido considerado, já que não é nada particularmente engenhoso. Então deve haver algo errado com isso. O que está errado?