Como usar o strace para monitorar chamadas do sistema Linux

Conteúdo

Uma janela de terminal estilizada em um laptop.

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

O kernel e chamadas de sistema

Não importa o quão inteligentes eles sejam, programas de computador não podem fazer tudo sozinhos. Eles precisam fazer solicitações para que certas funções sejam realizadas. Essas solicitações vão para o kernel do Linux. Em geral, existe uma biblioteca ou outra interface de software que o programa chama, e então a biblioteca faz a solicitação apropriada, chamada de sistema, todo o kernel.

Ser capaz de ver as chamadas do sistema que um programa fez e quais foram as respostas pode ajudá-lo a entender o funcionamento interno dos programas que interessam a você ou que você escreveu.. Este é naquela strace faz. Pode ajudar a resolver problemas e encontrar gargalos.

Isso não é o mesmo que depurar um aplicativo com uma ferramenta como gdb . Um programa de depuração permite que você investigue o funcionamento interno de um programa enquanto ele está sendo executado. Permite que você percorra a lógica do seu programa e inspecione a memória e os valores das variáveis. Em comparação, naquela strace o que ele faz é capturar as informações da chamada do sistema enquanto o programa está sendo executado. Quando o programa rastreado termina, strace lista as informações da chamada do sistema na janela do terminal.

As chamadas do sistema fornecem todos os tipos de funções de baixo nível, como ações de leitura e gravação em arquivos, eliminação do processo, etc. Há uma lista de centenas de chamadas de sistema no página de manual de syscalls.

RELACIONADO: Depuración con GDB: introdução

Instalación de strace

E strace aún no está instalado en su computadora, puede instalarlo muy fácilmente.

No Ubuntu, use este comando:

sudo apt install strace

No Fedora, escreva este comando:

sudo dnf install strace

Em manjaro, o comando é:

sudo pacman -Sy strace

Primeros pasos con strace

Usaremos un pequeño programa para demostrar strace. No hace mucho: abre un archivo y escribe una línea de texto en él, y no tiene ningún error al verificarlo. Es solo un truco rápido para que tengamos algo con qué utilizar strace.

#incluir <stdio.h>

int principal(int argc, char argv[]) { 

  // file handle 
  FILE *fileGeek;

  // open a file called "strace_demo.txt", or create it 
  fileGeek = fopen("strace_demo.txt", "C");

  // write some text to the file 
  fprintf(fileGeek, "Write this to the file" );

  // close the file 
  fclose(fileGeek);

  // exit from program 
  return (0); 

} // fim do principal

Verificamos quantos scripts estavam no diretório e, em seguida, executamos o script “file-io.cy lo compilamos con gcc en un ejecutable llamado stex, nombrado paraS traza examplio.

gcc -o stex file-io.c

Llamaremos strace desde la línea de comando y pasarle el nombre de nuestro nuevo ejecutable como el procedimiento que queremos rastrear. Podemos facilmente rastrear qualquer um dos comandos do Linux ou qualquer outro executável binário. Estamos usando nosso pequeno programa por dois motivos.

A primeira razão é que strace é prolixo. Pode haver muitos resultados. Isso é ótimo quando você está usando strace irritado, mas pode ser opressor no início. São limitados strace partida para o 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 do funcionamento interno do programa..

strace ./stex

Podemos ver claramente o write llamada al sistema enviando el textoEscribe esto en el archivoa nuestro archivo abierto y el exit_group chamada de sistema. Isso termina todos os threads no aplicativo e envia um valor de retorno para o shell.

Filtre a saída

Mesmo com nosso programa de demonstração simples, há saída suficiente. Podemos usar o -e Opção (expressão). Vamos passar o nome da chamada de 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 nenhum espaço em branco na lista de chamadas do sistema.

strace -e fechar,escrever ./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 você pediu para ver, mas você 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..

As vezes, é mais conveniente capturar tudo e pesquisar e rolar por todo o conjunto de resultados. Assim, não excluirá acidentalmente nada importante. a -o Opção (Saída) permite que você envie a saída de um strace sessão para um arquivo de texto.

strace -o trace-output.txt ./stex

A seguir, você pode usar o less comando para percorrer a lista e encontrar chamadas do sistema, ou qualquer outra coisa, pelo nome.

menos trace-output.txt

Agora você pode usar todos lessrecursos de pesquisa para investigar a saída.

RELACIONADO: Como usar o comando less no Linux

Adicionar carimbos de data / hora

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

strace -r ./stex

Os carimbos de data / hora são exibidos no início de cada linha de início.

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

strace -T ./stex

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

Para ver a hora em que cada chamada do sistema foi chamada, Use o -tt (timestamps absolutos). Esto muestra la hora delreloj de pared”, com resolução de microssegundos.

strace -tt ./stex

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

Acompanhamento de um procedimento em execução

Se o procedimento que você deseja rastrear já estiver em execução, ainda pode anexar strace isto. Para faze-lo, você precisa saber o id do procedimento. Você pode usar ps com grep para encontrar isso. Temos Firefox rodando. Para descobrir o ID do firefox processo, podemos usar ps e canalizá-lo através grep.

ps -e | grep firefox

Podemos ver que o ID do procedimento é 8483. Nós vamos usar o -p (ID de procedimento) opção de dizer strace qual procedimento anexar a. Observe que você precisará usar sudo :

sudo strace -p 8483

Você verá uma notificação de que strace foi anexado ao procedimento, e então as chamadas de rastreamento do sistema serão mostradas na janela do terminal, como de costume.

Crie um relatório

a -c (apenas resumo) opção causa strace imprimir um relatório. Gera uma tabela para obter informações sobre as chamadas do sistema feitas pelo programa rastreado.

strace -c ./stex

As colunas são:

  • % clima: A porcentagem de tempo de execução gasto em cada chamada do sistema.
  • segundos: O tempo total em segundos e microssegundos para cada chamada do sistema.
  • usecs / ligar: O tempo médio em microssegundos gasto em cada chamada do sistema.
  • chamadas: O número de vezes que cada chamada do sistema foi executada.
  • erros: O número de falhas para cada chamada do sistema.
  • syscall: O nome da chamada do sistema.

Estes valores mostrarão zeros para programas triviais que rodam e terminam rapidamente. Os valores do mundo real são exibidos para programas que fazem algo mais significativo do que nosso aplicativo de demonstração.

Percepções profundas, facilmente

a strace A saída pode mostrar quais chamadas de sistema estão sendo feitas, quais são feitas repetidamente e quanto tempo de execução está sendo gasto dentro do código do lado do kernel. Essa é uma ótima informação. Frequentemente, quando você tenta entender o que está acontecendo dentro do seu código, é fácil esquecer que seu binário está interagindo quase sem parar com o kernel para realizar muitas de suas funções.

Através do uso strace, você vê a imagem inteira.

Assine a nossa newsletter

Nós não enviaremos SPAM para você. Nós odiamos isso tanto quanto você.