Artigo :: Debugando com strace
Introdução
Ao final deste artigo, você entenderá como usar o strace para depurar programas sem acesso ao código-fonte, rastrear chamadas de sistema e solucionar problemas de execução no Linux.
Visão Geral
Depurar sem código-fonte pode parecer resolver um quebra-cabeça no escuro. O strace ilumina o caminho mostrando exatamente quais chamadas de sistema um programa faz, desde abertura de arquivos até conexões de rede. Se você está solucionando um crash, investigando comportamento suspeito, ou apenas curioso sobre como um programa funciona por baixo dos panos, o strace é uma ferramenta essencial no seu kit Linux.
O strace monitora as chamadas de sistema e sinais de um programa específico, fornecendo a sequência de execução do início ao fim. É particularmente valioso quando você não tem acesso ao código-fonte e precisa entender o que um programa está realmente fazendo no nível do sistema.
Pré-requisitos
Antes de começar, você deve ter:
- Familiaridade básica com a linha de comando do Linux
- Compreensão do que é um processo e como programas executam
- Um sistema Linux com strace instalado (a maioria das distribuições já inclui por padrão)
which strace ou strace --version para verificar a instalação. Se não estiver instalado, use seu gerenciador de pacotes: sudo apt install strace ou sudo yum install strace.O que é strace?
Strace é uma ferramenta de diagnóstico e depuração que intercepta e registra chamadas de sistema feitas por um processo. É particularmente útil quando:
- Você não tem acesso ao código-fonte
- Um programa trava ou se comporta inesperadamente
- Você precisa entender padrões de acesso a arquivos
- Você está investigando gargalos de performance
- Você quer ver o que um programa está fazendo “por baixo dos panos”
Rastreando uma Execução
A maneira mais simples de usar o strace é executá-lo com um programa:
| |
Isso exibe toda chamada de sistema feita pelo programa no stderr, o que pode ser muito para programas complexos.
Opções úteis:
-o saida.txt- Grava a saída em um arquivo em vez do stderr-t- Mostra timestamps para cada chamada de sistema-r- Mostra timestamps relativos (tempo decorrido entre chamadas)
Para programas complexos, sempre use -o para gravar a saída em um arquivo:
| |
Isso torna a saída muito mais fácil de pesquisar e analisar depois.
Filtrando Chamadas de Sistema
O verdadeiro poder do strace vem da filtragem. Use a opção -e para focar em chamadas de sistema específicas:
| |
Isso mostra apenas chamadas relacionadas à rede, filtrando centenas de chamadas de sistema irrelevantes.
Ao especificar múltiplas chamadas de sistema, não adicione espaços após as vírgulas:
- Correto:
-e open,read,write - Errado:
-e open, read, write(vai falhar)
Categorias comuns de filtro:
-e trace=file- Todas as operações de arquivo (open, read, write, close, stat)-e trace=process- Gerenciamento de processos (fork, exec, wait, exit)-e trace=network- Operações de rede (socket, connect, send, recv)-e trace=signal- Manipulação de sinais-e trace=ipc- Comunicação entre processos
Anexando a Processos em Execução
Você pode anexar o strace a um processo já em execução usando seu PID:
| |
Isso é inestimável para depurar sistemas ao vivo sem reiniciar serviços.
Exemplo: Depurar um servidor web travado:
| |
Analisando Estatísticas do Programa
A flag -c fornece um relatório resumido em vez de saída detalhada, mostrando:
- Tempo gasto em cada chamada de sistema
- Número de vezes que cada chamada foi feita
- Erros encontrados
| |
Isso é perfeito para análise de performance e identificação de gargalos.
Exemplo de saída:
% time seconds usecs/call calls errors syscall
------ ----------- ----------- --------- --------- ----------------
45.12 0.012345 23 537 read
32.45 0.008876 45 197 write
12.34 0.003376 112 30 open
Use -c com -e para obter estatísticas de tipos específicos de chamadas:
| |
Isso mostra apenas as estatísticas de chamadas de sistema relacionadas a arquivos.
Pontos-Chave
- strace revela chamadas de sistema feitas por programas, essencial para depuração sem código-fonte
- Use -e para filtrar chamadas de sistema e reduzir ruído na saída
- Use -p PID para anexar a processos em execução (cuidado em produção!)
- Use -c para análise de performance e estatísticas de chamadas
- Grave a saída em arquivos com -o para facilitar a análise
- Entender chamadas de sistema ajuda você a ver o que os programas realmente fazem no nível do SO.
Exercícios Práticos
- Execute
strace ls /tmpe identifique as chamadas de sistema usadas para ler o diretório - Use
strace -e open cat /etc/passwdpara ver quais arquivos ocatabre antes de ler seu arquivo alvo - Crie um script Python simples e use
strace -cpara analisar quais chamadas de sistema dominam - Anexe o strace a um processo de longa duração (como um editor de texto) e observe suas chamadas de sistema durante tempo ocioso
Leitura Adicional
- Começando com GDB - Aprenda depuração em nível de código com GDB
- Syscalls do Linux em Assembly - Entenda chamadas de sistema em um nível mais profundo
- Página man do strace - Documentação de referência completa