Os programas Linux pedem ao kernel para fazer algumas coisas por eles. O strace
comando revela essas chamadas de sistema. Você pode usá-los para entender como os programas funcionam e por que, às vezes, não funcionam.
Índice
Por mais espertos que sejam, os programas de computador não podem fazer tudo sozinhos. Eles precisam fazer solicitações para que certas funções sejam executadas por 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 a biblioteca faz a solicitação apropriada – chamada de chamada de sistema – ao kernel.
Ser capaz de ver as chamadas de 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. Isso é o que strace
faz . Pode ajudar a solucionar problemas e procurar gargalos.
Isso não é o mesmo que depurar um aplicativo com uma ferramenta semelhante gdb
. Um programa de depuração permite investigar a operação interna de um programa enquanto ele é executado. Ele permite que você percorra a lógica do seu programa e inspecione a memória e os valores das variáveis. Em comparação, o que strace
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 para a janela do terminal.
As chamadas do sistema fornecem todos os tipos de funcionalidade de baixo nível, como ações de leitura e gravação em arquivos, eliminação de processos e assim por diante. Há uma lista de centenas de chamadas de sistema na página do manual syscalls .
Se strace
ainda não estiver instalado em seu computador, você pode instalá-lo facilmente.
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
Usaremos um pequeno programa para demonstrar strace
. Não faz muito: abre um arquivo e grava uma linha de texto nele, e não há nenhum erro de verificação nele. É apenas um hack rápido para que tenhamos algo para usar strace
.
#include <stdio.h> int main (int argc, char argv []) { // identificador de arquivo FILE * fileGeek; // abra um arquivo chamado "strace_demo.txt" ou crie-o fileGeek = fopen ("strace_demo.txt", "w"); // escreve algum texto no arquivo fprintf (fileGeek, "Grave isso no arquivo"); // feche o arquivo fclose (fileGeek); // sair do programa return (0); } // fim do principal
Nós salvo isso em um arquivo chamado “arquivo-io.c” e compilado-lo com gcc
em um arquivo executável chamado stex
, chamado de “ st raça ex amplo.”
gcc -o stex arquivo-io.c
Vamos chamar strace
da linha de comando e passar o nome de nosso novo executável para ele como o processo que queremos rastrear. Poderíamos rastrear facilmente 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 muita produção. Isso é ótimo quando você está usando strace
raiva, mas pode ser opressor no início. Há strace
produção limitada para nosso pequeno programa. A segunda razão é que nosso programa tem funcionalidade limitada e o código-fonte é curto e direto. Isso torna mais fácil identificar quais seções da saída se referem às diferentes partes do funcionamento interno do programa.
strace ./stex
Podemos ver claramente a write
chamada do sistema enviando o texto “Grave isso no arquivo” para o nosso arquivo aberto e a exit_group
chamada do sistema. Isso termina todos os threads no aplicativo e envia um valor de retorno de volta ao shell.
Mesmo com nosso programa de demonstração simples, há bastante saída. Podemos usar a -e
opção (expressão). Passaremos o nome da chamada de sistema que queremos ver.
strace -e write ./stex
Você pode relatar várias chamadas de 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 close, write ./stex
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 algumas dessas outras saídas podem ser mais úteis para você do que as coisas que você pediu para ver.
Às vezes, é mais conveniente capturar tudo, pesquisar e rolar por todo o conjunto de resultados. Dessa forma, você não excluirá acidentalmente nada importante. A -o
opção (saída) permite enviar a saída de uma strace
sessão para um arquivo de texto.
strace -o trace-output.txt ./stex
Você pode então usar o less
comando para rolar pela lista e pesquisar chamadas do sistema – ou qualquer outra coisa – por nome.
menos trace-output.txt
Agora você pode usar todos less
os recursos de pesquisa de para investigar a saída.
Você pode adicionar vários carimbos de data / hora diferentes à saída. A opção -r
(carimbos de data / hora relativos) adiciona carimbos de data / hora que mostram 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 saída.
Para ver o tempo gasto em cada chamada do sistema, use a opção -T
(syscall-times). Mostra a duração do tempo gasto em cada chamada do sistema.
strace -T ./stex
As durações são mostradas no final de cada linha de chamada do sistema.
Para ver a hora em que cada chamada do sistema foi chamada, use a opção -tt
(carimbos de data / hora absolutos). Mostra o tempo do “relógio de parede”, com resolução de microssegundos.
strace -tt ./stex
Os tempos são exibidos no início de cada linha.
Se o processo que você deseja rastrear já estiver em execução, você ainda poderá anexar strace
a ele. Para fazer isso, você precisa saber o ID do processo. Você pode usarps
com grep
para encontrar isso. Temos o Firefox em execução. Para descobrir o ID do firefox
processo, podemos usá ps
– lo e canalizá-lo grep
.
ps -e | grep firefox
Podemos ver que o ID do processo é 8483. Usaremos a opção -p
(ID do processo) para informar a strace
qual processo anexar. Observe que você precisará usar sudo
:
sudo strace -p 8483
Você verá uma notificação strace
anexada ao processo e, em seguida, as chamadas de rastreamento do sistema serão exibidas na janela do terminal como de costume.
A opção -c
(apenas resumo) faz strace
com que um relatório seja impresso. Ele gera uma tabela de informações sobre as chamadas do sistema que foram feitas pelo programa rastreado.
strace -c ./stex
As colunas são:
Esses valores mostrarão zeros para programas triviais que são executados e terminam rapidamente. Os valores do mundo real são mostrados para programas que fazem algo mais significativo do que nosso aplicativo de demonstração.
A strace
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 no código do kernel. Essa é uma ótima informação. Freqüentemente, quando você está tentando entender o que está acontecendo dentro de seu código, é fácil esquecer que seu binário está interagindo quase sem parar com o kernel para executar muitas de suas funções.
Ao usar strace
, você vê a imagem completa.
Muitos aplicativos de limpeza estão disponíveis para Windows ao longo dos anos, mas hoje em…
Seu PlayStation 4 está congelado? Seus jogos favoritos continuam travando? Reiniciar seu PS4 pode resolver…
A popularidade das mensagens de texto significou aprender uma forma totalmente nova de comunicação. Você…
A foto dos "Pilares da Criação" tirada pelo Telescópio Espacial Hubble é uma das fotos…
O Proton Drive saiu de seu estágio beta há algumas semanas, mas o aplicativo real…
Para ver suas fotos mais de perto ou para uma edição precisa , você pode…