Fundamentos do strace - Rastreando Chamadas de Sistema para Troubleshooting

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

  • = 0 ou 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.

Proximas Leituras