Como usar o STRACE para monitorar chamadas para o sistema Linux

Os programas Linux pedem ao kernel para fazer algumas coisas por eles. O comando strace revela essas chamadas de sistema. Você pode usá-los para entender como os programas funcionam e por que eles às vezes não funcionam.

índice

  1. O kernel e as chamadas do sistema
  2. instalação de strace
  3. Começando com strace
  4. filtrar a saída
  5. Envie a saída para um arquivo
  6. Adicionar carimbos de data/hora
  7. Trace um processo contínuo
  8. Criar um relatório
  9. Insights, facilitados

O kernel e as chamadas do sistema

Por mais inteligentes que sejam, os programas de computador não podem fazer tudo sozinhos. Eles precisam fazer solicitações para que determinadas funções sejam executadas para eles. Essas solicitações vão para o kernel do Linux. Normalmente, há uma biblioteca ou outra interface de software que o programa chama e, em seguida, a biblioteca faz a solicitação apropriada, chamada de chamada de sistema, ao kernel.

Ser capaz de ver as chamadas de sistema feitas por um programa e quais foram as respostas pode ajudá-lo a entender o funcionamento interno dos programas nos quais você está interessado ou que escreveu. Isso é o que o strace faz. Ele pode ajudar a solucionar problemas e encontrar gargalos.

Isso não é o mesmo que depurar um aplicativo com uma ferramenta como gdb . Um depurador permite examinar o funcionamento interno de um programa enquanto ele está em execução. Ele permite que você revise a lógica do seu programa e inspecione a memória e os valores das variáveis. Em comparação, o quê? strace não captura informações de chamadas do sistema enquanto o programa está em execução. Quando o programa de rastreamento termina, o strace lista as informações de chamada do sistema na janela do terminal.

As chamadas de sistema fornecem todos os tipos de funções de baixo nível, como ler e gravar ações em arquivos, encerrar processos e assim por diante. Há uma lista de centenas de chamadas de sistema na página man syscalls.

RELACIONADO: Depuração com GDB: Como começar

instalação de strace

strace em si ainda não está instalado no seu computador, você pode instalá-lo com muita facilidade.

No Ubuntu, use este comando:

 sudo apt install strace 

No Fedora, digite este comando:

 sudo dnf install strace 

No Manjaro, o comando é:

 sudo pacman -Sy strace 

Começando com strace

Usaremos um pequeno programa para demonstrar o strace . Não faz muito: abre um arquivo e escreve uma linha de texto nele, e não tem nenhuma verificação de erros. É apenas um hack rápido para que você tenha algo para usar o strace .

 #include <stdio.h> int main(int argc, char argv[]) { // identificador de arquivo FILE *fileGeek; // abre um arquivo chamado "strace_demo.txt", ou cria-o fileGeek = fopen("strace_demo.txt", "w"); // escreve algum texto no arquivo fprintf(fileGeek, "Write this to the file" ); // fecha o arquivo fclose(fileGeek); // sai do programa return(0); } // fim do principal

Nós o salvamos em um arquivo chamado "file-io.c" e o compilamos com gcc em um executável chamado stex , com a mensagem "I'm running previous broad."

 gcc -o arquivo stex-io.c

Chamaremos strace na linha de comando e passaremos a ele o nome do nosso novo executável como um processo que queremos rastrear. Poderíamos facilmente rastrear qualquer comando do Linux ou qualquer outro executável binário. Usamos nosso pequeno programa por dois motivos.

A primeira razão é que o strace é verboso. Pode haver muitos resultados. É ótimo quando você usa strace raivoso, mas pode ser esmagador no começo. Há saída de strace limitada para nosso pequeno programa. A segunda razão é que nosso programa tem funcionalidade limitada e o código fonte é curto e simples. Isso torna mais fácil identificar quais seções da saída se referem a diferentes partes da usinagem interna do programa.

 strace ./stex 

Podemos ver claramente a chamada de sistema write enviando o texto "Write this to file" para nosso arquivo aberto e a chamada de sistema exit_group . Isso encerra todos os encadeamentos no aplicativo e envia um valor de retorno ao shell.

filtrar a saída

Mesmo com nosso programa de demonstração simples, existem alguns resultados. Podemos usar a opção -e (expressão). Passaremos o nome da chamada do sistema que queremos ver.

 strace -e write ./stex 

Você pode relatar várias chamadas do sistema adicionando-as como uma lista separada por vírgulas. Não inclua espaços em branco na lista de chamadas do sistema.

 strace -e close,write ./stex 

Envie a saída para um arquivo

O benefício de filtrar a saída também é o problema de filtrar a saída. Você vê o que pediu para ver, mas não vê mais nada. E alguns desses outros resultados podem ser mais úteis para você do que as coisas que você pediu para ver.

Às vezes, é mais conveniente capturar tudo, pesquisar e percorrer todo o conjunto de resultados. Dessa forma, você não descartará acidentalmente nada importante. A opção -o (saída) permite enviar a saída de uma sessão strace para um arquivo de texto.

 strace -o trace-output.txt ./stex 

Você pode então usar o comando less para rolar pela lista e encontrar chamadas do sistema, ou qualquer outra coisa, pelo nome.

 menos trace-output.txt 

Agora você pode usar tudo menos os recursos de investigação do ' less para investigar o resultado.

RELACIONADO: Como usar o comando Less no Linux

Adicionar carimbos de data/hora

Você pode adicionar diferentes carimbos de data/hora à saída. O -r (timestamps relativos) adiciona timestamps mostrando a diferença de tempo entre o início de cada chamada de sistema subsequente. Observe que esses valores de tempo incluirão o tempo decorrido na chamada anterior do sistema e o que mais o programa estava fazendo antes da próxima chamada do sistema.

 strace -r ./stex 

Os carimbos de data/hora aparecem no início de cada linha de saída.

Para ver a quantidade de tempo gasto em cada chamada do sistema, use a opção -T (syscall-times). Mostra o tempo decorrido em cada chamada do sistema.

 strace -T ./stex 

As durações de tempo são exibidas no final de cada linha de chamada do sistema.

Para ver a hora em que cada chamada do sistema foi chamada, use a tecla -tt (timestamps absolutos). Exibe a hora do relógio de parede, com resolução de microssegundos.

 strace -tt ./stex 

Os tempos são mostrados no início de cada linha.

Trace um processo contínuo

Se o processo que você deseja rastrear já estiver em execução, você ainda poderá anexar o strace agora. Para fazer isso, você precisa saber o ID do processo. você pode usar ps com grep para encontrar isso. Temos o Firefox em execução. Para descobrir o ID do processo do firefox , podemos usar ps e passar por isso com grep .

 ps -e | grep firefox 

Podemos ver que o ID do processo é 8483. Usaremos a opção -p (ID do processo) para informar ao strace a qual processo se conectar. Observe que você precisa usar sudo :

 sudo strace -p 8483 

Você verá uma notificação de que o strace conectado ao processo, as chamadas do sistema de rastreamento serão exibidas na janela do terminal como de costume.

Criar um relatório

O -c (somente resumo) faz com que a opção strace imprima um relatório. Gera uma tabela com informações sobre as chamadas de sistema feitas pelo programa rastreado.

 strace -c ./stex 

As colunas são:

  • % Hora – A porcentagem de tempo de execução gasto em cada chamada do sistema.
  • segundos : o tempo total em segundos e microssegundos gasto em cada chamada do sistema.
  • usecs / call : o tempo médio em microssegundos gasto em cada chamada do sistema.
  • quem ama : o número de vezes que cada chamada do sistema foi feita.
  • errors : O número de erros para cada chamada do sistema.
  • syscall : O nome da chamada do sistema.

Esses valores exibirão zeros para programas triviais que são executados e encerrados rapidamente. Os valores do mundo real são mostrados para programas que fazem algo mais significativo do que nosso aplicativo de demonstração.

Insights, facilitados

A saída strace pode mostrar quais chamadas de sistema são feitas, quais são executadas repetidamente e quanto tempo de execução é gasto dentro do código do lado do kernel. Esta é uma ótima informação. Muitas vezes, quando você está tentando descobrir o que está acontecendo dentro do seu código, é fácil esquecer que seu binário quase continuamente interage com o kernel para executar muitas de suas funções.

Usando strace , veja a imagem inteira.

  • Habilite o compartilhamento de fontes da web para acelerar seu site
  • Onde está a "lixeira" em um Mac?

descubra mais conteúdo

Google Pixel Watch também tem detecção de queda, mas não até o próximo ano

As melhores xícaras de café aquecidas de 2022

Como automatizar seu iPhone com base na hora, atividade ou localização

"Isso deve ter sido antes do meu tempo"

Por que a NASA enviou Snoopy para a Lua? – Revisão geek

O que é uma carga fantasma?

Deixe uma resposta Cancelar resposta

strace é um utilitário de verificação de erros de linha de comando para o sistema operacional GNU/Linux. Ele permite monitorar as chamadas de sistema utilizadas por um determinado programa e todos os sinais que ele recebe.Sua operação é possível por meio de um recurso do kernel linux chamado ptrace.

Ir arriba