Header Ads

Como usar o strace para rastrear chamadas e sinais do sistema

Rastrear um programa de computador não é reservado apenas para aqueles que possuem o código-fonte, podem lê-lo e sabem como usar um depurador. Qualquer usuário Linux pode rastrear um executável com strace. Descubra como!

O que é strace?

strace é um utilitário do Linux que permite rastrear as chamadas do sistema que um determinado aplicativo faz. Ele também capta sinais e produz uma saída detalhada de todas as informações que observa.

Uma pessoa nova para rastrear e rastrear, em geral, pode perguntar por que isso é útil. Um engenheiro de TI profissional pode perguntar quanto fluxo de informações pode realmente coletar, especialmente se souber o quanto pode ser visualizado em um depurador como o GDB.

RELACIONADOComo funcionam os sinais do Linux: SIGINT, SIGTERM e SIGKILL

Se você estiver interessado em depurar programas e códigos de computador, dê uma olhada em nosso Debugging with GDB: Getting Started article.

Há boas notícias em ambos os casos! Rastrear todas as chamadas e sinais do sistema fornece uma imagem abrangente da operação de um programa e é uma excelente ferramenta de solução de problemas e até mesmo de depuração. Além disso, ele é executado durante o tempo de execução (como um processo de invólucro), mas pode rastrear facilmente em um arquivo de log e torna uma visão geral fácil de digerir das ações de um programa.

Comparando isso com o GDB, que também é um processo de empacotamento, as coisas são substancialmente diferentes. Por exemplo, no GDB, pode-se rastrear um programa passo a passo (por exemplo, uma linha de código por vez ou um bloco lógico de código — ou usando pontos de interrupção no código). No entanto, essas etapas são feitas durante o tempo de execução, enquanto o strace simplesmente executa o programa como um todo até que ocorra algum erro ou até a conclusão.

O engenheiro ou usuário pode então ir e analisar o registro completo (baseado em texto), procurar strings interessantes, etc. Além disso, o GDB permitiria que se vissem os sinais e chamadas do sistema também, embora configurando isso e analisando o mesmo é muito mais complexo do que com strace.

Com strace, você pode simplesmente executar o programa em strace (ou seja, strace some_program) e, embora seja quase o mesmo que GDB, a operação difere significativamente, conforme descrito acima.

Quanto à quantidade de informação que pode ser visualizada em um rastreamento, é bom dar um passo para trás e lembrar de onde vem a maioria dos problemas do computador — disco cheia, memória esgotada, algum arquivo não foi encontrado, entrada incorreta, etc.

Especialmente nas áreas de acesso ao disco, o strace realmente brilha. Como ele registra todas as chamadas do sistema, cada acesso ao disco é muito visível no log. Novamente, você pode pesquisar strings de texto e nomes de arquivo relevantes, embora esteja ciente de que, às vezes, as strings podem ter seu comprimento reduzido, então apenas a saída parcial pode ser visível.

Em resumo, se tivéssemos que classificar o strace como uma ferramenta de depuração e / ou solução de problemas e atribuir a ele um lugar em uma caixa de ferramentas de usuário Linux mais recente ou mais proficiente, então, em ambos os casos, a resposta está aproximadamente no meio, embora inclinando-se um pouco mais para a solução de problemas do que para a depuração. Vamos instalar o strace a seguir.

RELACIONADO: Como funcionam as portas lógicas: OR, AND, XOR, NOR, NAND, XNOR e NOT

Instalando o strace

Para instalar o strace em sua distribuição Linux baseada em Debian / Apt (como Ubuntu e Mint), execute o seguinte comando em seu terminal:

sudo apt install strace

Para instalar o strace em sua distribuição Linux baseada em RedHat / Yum (como RHEL, Centos e Fedora), execute o seguinte comando em seu terminal:

sudo yum install strace

Usando strace

Depois de instalar o strace, é muito simples começar. Podemos, por exemplo, rastrear o comando / utilitário de suspensão do Linux:

 strace sleep 1 

Imediatamente, a saída prova a declaração feita acima. Há uma abundância de informações sobre todas as ações executadas pelo comando (muito) simples sleep 1, que, afinal, apenas ações adormecidas por um único segundo.

Vejamos algumas coisas que podemos observar imediatamente:

 acesso ("/ etc / ld. so. preload", R_OK) = -1 ENOENT (Não existe esse arquivo ou diretório) 

Podemos ver que logo após o início, o programa tentou acessar (no disco) o arquivo /etc/ld. so. preload. Também podemos ver que isso falhou (status -1), pois o arquivo não foi encontrado (ENOENT) com a mensagem de erro descritiva Nenhum arquivo ou diretório.

Apenas esta linha de saída pode levar a pesquisas adicionais. Por exemplo, podemos verificar em nosso mecanismo de pesquisa favorito o que o arquivo /etc/ld. so. preload é / faz e o que acontece quando um programa não consegue encontrá-lo, bem como como podemos instalá-lo.

Como você pode ver, se você executar um software / programa mais complicado em strace, poderá descobrir que ele está tentando acessar um arquivo — por exemplo , uma biblioteca . so compartilhada — e não consigo encontrá-la. É facilmente analisado e provavelmente facilmente corrigido graças ao strace.

A seguir, vemos o cache binário conf.d sendo aberto com sucesso como somente leitura (O_RDONLY), com o sinalizador close-on-exec (usado em programas multithread para evitar condições de corrida) sinalizador O_CLOEXEC definido:

 openat (AT_FDCWD, "/etc/ld. so. cache", O_RDONLY | O_CLOEXEC) = 3 

Mesmo que não se saiba o que cada item significa, uma simples pesquisa online fornecerá rapidamente informações sobre cada termo ou palavra específica, ajudando a compreender as informações apresentadas e o que está acontecendo.

Também de particular interesse é esta linha no final:

 +++ saiu com 0 +++ 

Isso indica que o programa foi encerrado com sucesso com o código de saída 0. Um código de saída 0 geralmente indica execução e encerramento bem-sucedidos em programas Linux.

Como você pode ver nos exemplos acima, é fácil ver o que um programa está fazendo usando o strace. Cada linha e até mesmo cada palavra em cada linha podem ser analisadas e, muitas vezes, um mecanismo de busca é necessário para lançar alguma luz. No entanto, até mesmo dar uma olhada na saída de um programa com falha pode ser o suficiente para encontrar a causa exata e corrigi-la, especialmente quando, por exemplo, um arquivo necessário está faltando, etc.

RELACIONADO: como os níveis de execução do Linux afetam os serviços em execução

Rastreando processos filho

Ao usar strace, às vezes parecerá que strace não está rastreando corretamente todas as chamadas de sistema do programa, etc. Isso pode ser simplesmente porque o programa que está sendo rastreado iniciou / iniciou uma série de processos filho, para por exemplo, bifurcando processos-filho.

É simples incluir esses processos filho na captura de strace: basta adicionar a opção -f à linha de comando (ou seja, strace -f seu_programa) e todas as chamadas de sistema, etc., de todos os processos filhos também será rastreado.

Concluindo

Neste artigo, discutimos a ferramenta strace, que pode ser usada para rastrear qualquer programa ou aplicativo em execução em um computador baseado em Linux.

Depois de instalar a ferramenta, podemos iniciar o programa em strace de maneira simples e direta e aproveitar o alto nível de solução de problemas e informações de depuração que o wrapper strace nos apresentará.

Nenhum comentário