Fundamentos do strace - Rastreando Chamadas de Sistema para Troubleshooting
O que e o strace?
strace e uma ferramenta de depuracao que registra e exibe as chamadas de sistema (requisicoes ao kernel) e sinais emitidos por um processo em tempo real. Ele expoe interacoes brutas como abertura de arquivos, estabelecimento de conexoes de rede e criacao de processos filhos -- tudo visivel mesmo sem o codigo-fonte.
Quando usar o strace
- Nenhuma saida util nos logs, ou mensagens de erro que nao revelam nada
- Incerteza sobre qual arquivo de configuracao a aplicacao esta realmente lendo
- "Permission denied" ocorre mas voce nao sabe qual caminho esta sendo rejeitado
- Conexoes de rede falham por razoes obscuras
Por que o strace ajuda no troubleshooting?
Toda aplicacao, por mais complexa que seja, acessa hardware e recursos do SO atraves de chamadas de sistema do kernel. O strace monitora exatamente essa interface -- portanto, mesmo sem codigo-fonte, voce pode ver precisamente o que um processo tentou fazer e por que falhou.
Erros no nivel do kernel como errno: ENOENT (arquivo nao encontrado), errno: EACCES (permissao negada) e errno: ECONNREFUSED (conexao recusada) aparecem diretamente na saida do strace. Mesmo quando uma aplicacao registra apenas "Ocorreu um erro", o strace leva voce a causa raiz.
Como instalar o strace?
A maioria das distribuicoes inclui o strace por padrao. Instale-o com seu gerenciador de pacotes se estiver ausente.
# Ubuntu / Debian sudo apt install strace # RHEL / CentOS / Fedora sudo dnf install strace
Verifique a instalacao:
strace --version
strace -- version 6.x ...
Uso Basico
Rastrear um comando diretamente
strace ls /tmp
Uma sequencia de saida aparece. As ultimas linhas mostram o status de saida.
execve("/bin/ls", ["ls", "/tmp"], 0x7fff... /* 20 vars */) = 0
brk(NULL) = 0x55d3e...
...
openat(AT_FDCWD, "/tmp", O_RDONLY|O_NONBLOCK|O_CLOEXEC|O_DIRECTORY) = 3
...
+++ exited with 0 +++
Anexar a um processo em execucao
sudo strace -p PID
Encontre o PID com ps aux ou pgrep:
# Encontrar PID pelo nome do processo pgrep nginx # Anexar sudo strace -p 12345
Anexar com -p geralmente requer privilegios root (nao e necessario para seus proprios processos). Anexar a um servico em producao pode afetar seu desempenho.
Rastrear processos filhos tambem
Para servicos multi-processo, -f e essencial:
strace -f -p PID
Como filtrar chamadas de sistema especificas?
A saida padrao e volumosa. Use -e trace= para restringir o foco:
strace -e trace=openat ls /tmp
Filtros comuns:
| Filtro | Rastreia |
|---|---|
openat |
Abertura de arquivos |
read,write |
Leituras e escritas |
connect |
Conexoes de rede |
execve |
Execucao de processos |
file |
Todas as chamadas de arquivo |
network |
Todas as chamadas relacionadas a rede |
# Rastrear apenas acesso a arquivos strace -e trace=file command # Rastrear apenas conexoes de rede strace -e trace=network command
Como ler a saida do strace?
O formato basico e:
syscall_name(args...) = return_value
Sucesso:
openat(AT_FDCWD, "/etc/hosts", O_RDONLY) = 3
Falha -- ENOENT (arquivo nao encontrado):
openat(AT_FDCWD, "/etc/myapp.conf", O_RDONLY) = -1 ENOENT (No such file or directory)
Falha -- EACCES (permissao negada):
openat(AT_FDCWD, "/root/secret", O_RDONLY) = -1 EACCES (Permission denied)
Lendo o valor de retorno
= 0ou maior: sucesso (numero do file descriptor, bytes processados, etc.)= -1: falha. O token errno que segue nomeia a razao especifica.
Padroes Comuns de Troubleshooting
Padrao 1: Aplicacao nao lendo seu arquivo de configuracao
strace -e trace=openat myapp 2>&1 | grep "ENOENT"
openat(AT_FDCWD, "/etc/myapp/config.yaml", O_RDONLY) = -1 ENOENT (No such file or directory) openat(AT_FDCWD, "/home/user/.myapp/config.yaml", O_RDONLY) = -1 ENOENT (No such file or directory)
Voce pode ver exatamente quais caminhos a aplicacao tenta acessar.
Padrao 2: Identificando a causa de Permission denied
strace -e trace=openat myapp 2>&1 | grep "EACCES"
openat(AT_FDCWD, "/var/run/myapp.pid", O_WRONLY|O_CREAT) = -1 EACCES (Permission denied)
O caminho exato sendo rejeitado se torna visivel.
Padrao 3: Diagnosticando uma falha de conexao
strace -e trace=network myapp 2>&1 | grep -E "connect|ECONNREFUSED"
connect(3, {sa_family=AF_INET, sin_port=htons(5432), sin_addr=inet_addr("127.0.0.1")}, 16) = -1 ECONNREFUSED (Connection refused)
Confirme se o endereco e a porta correspondem as suas expectativas.
Padrao 4: Salvar saida para analise posterior
strace -o /tmp/trace.log -f myapp grep ENOENT /tmp/trace.log
-o redireciona a saida para um arquivo, mantendo o stderr limpo e facilitando o uso de grep ou less posteriormente.
Referencia Pratica de Opcoes
| Opcao | Efeito |
|---|---|
-p PID |
Anexar a um processo em execucao |
-f |
Rastrear processos filhos criados por fork/clone |
-e trace= |
Filtrar chamadas de sistema especificas |
-o file |
Escrever saida em arquivo em vez de stderr |
-t |
Prefixar cada linha com horario |
-tt |
Timestamps com precisao de microssegundos |
-T |
Mostrar tempo gasto em cada chamada de sistema |
-c |
Exibir resumo de contagens, tempos e erros |
-s 256 |
Definir comprimento maximo de exibicao de string (padrao: 32) |
-q |
Suprimir mensagens "Attaching..." |
Verificando estatisticas com -c
strace -c ls /tmp
% time seconds usecs/call calls errors syscall ------ ----------- ----------- --------- --------- ---------------- 35.14 0.000147 14 10 mmap 18.42 0.000077 11 7 openat ... ------ ----------- ----------- --------- --------- ---------------- 100.00 0.000418 48 2 total
Obtenha uma visao rapida de quais chamadas estao consumindo mais tempo.