Como usar o strace para rastrear chamadas e sinais do sistema

Conteúdo

Bash Shell

O rastreamento de um programa de computador não é reservado apenas para aqueles que possuem o código-fonte, eles podem ler e saber como usar um depurador. Qualquer usuário Linux pode rastrear um executável com strace. Descobrir como!

O que é strace?

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

Uma nova pessoa para rastejar e rastejar, em geral, você pode perguntar por que isso é útil. Um engenheiro de TI profissional pode perguntar quantas informações o Strace pode realmente capturar, especialmente se você souber quanta informação um depurador como o GDB pode ver.

Se você estiver interessado em depurar códigos e programas de computador, veja nossa postagem Depurando com GDB: introdução.

Há boas notícias em ambos os casos! O rastreamento de todas as chamadas e sinais do sistema fornece uma imagem completa da operação de um programa, e é uma ótima ferramenta de solução de problemas e até mesmo de depuração. Ao mesmo tempo, corre durante todo o tempo de execução (como um procedimento de embrulhar), mas pode ser facilmente rastreado em um arquivo de log e oferece uma visão geral fácil de digerir das ações de um programa.

Comparando isso com GDB, que também é um procedimento de embrulhar, as coisas são substancialmente diferentes. Como um exemplo, e GDB, pode-se traçar um programa passo a passo (como um exemplo, uma linha de código ao mesmo tempo ou um bloco lógico de código, ou usando pontos de interrupção no código). Apesar disto, essas etapas são realizadas no decorrer tempo de execução, enquanto strace apenas executa o programa como um todo até que algum erro ocorra ou até que ele seja concluído.

O engenheiro ou usuário pode ir e analisar todo o registro (baseado em texto), procure cordas interessantes, etc. Ao mesmo tempo, GDB permitiria ver sinais e chamadas para o sistema, além, mesmo que configurá-lo e analisá-lo seja muito mais complexo do que com strace.

Construir, você pode simplesmente executar o programa em strace (Em outras palavras strace some_program), e mesmo que seja quase o mesmo que GDB, a operação difere significativamente, como descrito anteriormente.

Quanto à quantidade de informações que podem ser vistas em um traço, é bom dar um passo para trás e lembrar de onde vem a maioria dos problemas do computador: Disco Cheio, memória exausta, nenhum arquivo encontrado, entrada errada, etc.

Especialmente em áreas de acesso ao disco, strace verdadeiramente brilha. Como ele registra todas as chamadas do sistema, todo acesso ao disco é altamente visível no registro. Novamente, pode pesquisar strings de texto e nomes de arquivo relevantes, mesmo quando você tem em mente que, as vezes, correntes podem ser reduzidas em comprimento, então apenas a saída parcial pode ser visível.

Em resumo, se tivéssemos que nos qualificar 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 solução é mais ou menos no meio, embora se incline um pouco mais para a solução de problemas do que para depuração. Vamos instalar strace Próximo.

RELACIONADO: Como funcionam as portas lógicas: OU, E, XOR, NEM, NAND, XNOR y NOT

Instalando strace

Instalar 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

Instalar 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 strace, é muito fácil começar. Nós podemos, como um exemplo, rastreie o linux sleep comando / Utilitário:

strace sleep 1

traço de um processo de sonho de um segundo

Imediatamente, o resultado prova a afirmação acima. Há uma abundância de informações sobre todas as ações realizadas pelo (muito) simples sleep 1 comando, naquela, depois de tudo, 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 tal arquivo ou diretório)

Podemos ver que logo depois de começar, o programa tentou entrar (No disco) arquivar /etc/ld.so.preload. Também podemos ver que isso falhou (-1 status), já que o arquivo não foi encontrado (ENOENT) com mensagem de erro descritiva No such file or directory.

Apenas esta única linha de partida poderia levar a uma investigação mais aprofundada. Como um exemplo, podemos verificar nosso mecanismo de pesquisa favorito procurando o que o arquivo /etc/ld.so.preload isto é / faz e o que acontece quando um programa não consegue encontrar, e também como podemos instalá-lo.

Como você pode ver, se eu rodasse um software / programa mais complexo em strace, é possível que ele descubra que está tentando entrar em um arquivo, como um exemplo, um arquivo compartilhado .so biblioteca e não consigo encontrar. Analisado facilmente e provavelmente corrigido facilmente graças a strace.

A seguir, nós vemos o conf.d cache binário que abre com sucesso como somente leitura (O_RDONLY), com a sinalização close-on-exec (usado em programas multithread para evitar condições de corrida) O_CLOEXEC conjunto de bandeiras:

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

Mesmo que você não saiba o que cada elemento significa, uma simples pesquisa online fornecerá rapidamente informações sobre cada termo ou palavra específica, que o ajudará a entender 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 de 0 geralmente indica execução bem-sucedida e encerramento de programas Linux.

Como você pode ver nos exemplos acima, é fácil ver o que um programa faz usando strace. Você pode analisar cada linha e até mesmo cada palavra em cada linha e, frequentemente, é preciso um mecanismo de pesquisa para lançar alguma luz. Apesar disto, 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., e especialmente quando, como um exemplo, um arquivo obrigatório está faltando, etc.

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

Monitoramento de processo secundário

Quando você usa strace, às vezes vai 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 foi iniciado / iniciou vários processos filhos, como um exemplo, ao ramificar processos filhos.

É simples incluir esses processos filho na captura de strace: apenas adicione o -f opção de linha de comando (Em outras palavras, strace -f your_program), e também todas as chamadas para o sistema serão rastreadas, etc., de todos os processos filhos.

Final

Neste post, nós discutimos o strace ferramenta, que pode ser usado para rastrear qualquer programa ou aplicativo em execução em um computador baseado em Linux.

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

Assine a nossa newsletter

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