Programas Linux pedem ao
núcleo
para fazer algumas coisas para eles. o
strace.
O comando revela essas chamadas do sistema. Você pode usá-los para entender como os programas funcionam e por que, às vezes, eles não.
O kernel e o sistema chama
Tão inteligente quanto eles podem ser, os programas de computador não podem fazer tudo para si mesmos. Eles precisam fazer solicitações para ter certas funções executadas para eles. Esses pedidos vão para o kernel do Linux. Normalmente, há uma biblioteca ou outra interface de software que o programa chama, e a biblioteca torna a solicitação apropriada chamada de uma chamada de sistema para o kernel.
Ser capaz de ver as chamadas do sistema que um programa fez e quais as respostas podem ajudá-lo a entender o funcionamento interno dos programas que lhe interessam ou que você escreveu. Isto é
o que
strace.
faz
. Pode ajudar a solucionar problemas e procurar os gargalos.
Isso não é o mesmo que
Depurando uma aplicação
com uma ferramenta como
gdb.
. Um programa de depuração permite investigar a operação interna de um programa como é executado. Ele permite que você passe pela lógica do seu programa e inspecione os valores de memória e variáveis. Em comparação, o que
strace.
O é capturar as informações de chamada do sistema à medida que o programa está sendo executado. Quando o programa rastreado termina,
strace.
Lista as informações de 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, matando processos e assim por diante. Há uma lista de centenas de chamadas do sistema no Syscalls Man Page. .
RELACIONADO: Depuração com o GDB: Introdução
Instalando Strace.
Se
strace.
já não está instalado no seu computador, você pode instalá-lo com muita facilidade.
No Ubuntu, use este comando:
sudo apt instalar strace
No Fedora, digite este comando:
Sudo DNF instalar strace
Em Manjaro, o comando é:
Sudo Pacman -y Strace
Primeiros passos com strace
Nós vamos usar um pequeno programa para demonstrar
strace.
. Não faz muito: abre um arquivo e escreve uma linha de texto para ele, e não tem qualquer verificação de erro nela. É apenas um hack rápido para que tenhamos algo para usar com
strace.
.
#include & lt; stdio.h & gt;
int Main (int argc, char argv []) {
// alça de arquivo
Arquivo * FileGeek;
// abre um arquivo chamado "strace_demo.txt" ou crie
FileGeek = FOPEN ("strace_demo.txt", "W");
// escreva algum texto para o arquivo
fprintf (FileGeek, "Escreva isso no arquivo");
// fechar o arquivo
fclose (FileGeek);
// Sair do programa
retorno (0);
} // final do principal
Nós salvamos isso em um arquivo chamado "file-io.c" e compilado com
gcc.
em um executável chamado
stex.
, nomeado para "
St.
raça
ex
amplo."
gcc -o stex file-io.c
Nós vamos ligar
strace.
Na linha de comando e passe o nome do nosso novo executável a ele como o processo que queremos ter rastreado. Poderíamos facilmente traçar qualquer um dos comandos do Linux ou qualquer outro executável binário. Estamos usando nosso minúsculo programa por duas razões.
A primeira razão é que
strace.
é verboso. Pode haver muita saída. Isso é ótimo quando você está usando
strace.
com raiva, mas pode ser esmagadora no começo. Há limitado
strace.
saída para o nosso minúsculo programa. A segunda razão é que nosso programa tem funcionalidade limitada, e o código-fonte é curto e direto. Isso facilita identificar quais seções da saída se referem às diferentes partes do funcionamento interno do programa.
Strace ./stex
Podemos ver claramente o
escrever
Chamada do sistema Enviando o texto "Escreva isso no arquivo" para o nosso arquivo aberto e
exit_group
chamada do sistema. Isso termina todos os encadeamentos no aplicativo e envia um valor de retorno de volta para o shell.
Filtrando a saída
Mesmo com nosso simples programa de demonstração, há muita saída. Nós podemos usar o
-e.
opção (expressão). Vamos passar no nome da chamada do sistema que queremos ver.
strace -e escrever ./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, escreva ./stex
Enviando a saída para um arquivo
O benefício de filtrar a saída é também o problema com a filtragem da saída. Você vê o que você pediu para ver, mas não vê mais nada. E alguns dessa outra saída podem ser mais úteis para você do que as coisas que você pediu para ver.
Às vezes, é mais conveniente capturar tudo e pesquisar e percorrer todo o conjunto de resultados. Dessa forma, você não excluirá acidentalmente nada importante. o
-o.
(Saída) Opção permite enviar a saída de um
strace.
sessão para um arquivo de texto.
strace -o trace-output.txt ./stex
Você pode então
use o
menos
comando
Para percorrer a listagem e procurar por chamadas do sistema - ou qualquer outra coisa.
Menos Trace-Output.txt
Agora você pode usar todos
menos
'S Capacidades de pesquisa para investigar a saída.
RELACIONADO: Como usar o comando menos no Linux
Adicionando timestamps.
Você pode adicionar vários timestamps diferentes à saída. o
-r.
(Timestamps relativos) Opção adiciona timestamps que mostram a diferença horária entre o início de cada chamada de sistema sucessiva. Observe que esses valores de tempo incluirão o tempo gasto na chamada anterior do sistema e qualquer outra coisa que o programa estava fazendo antes da próxima chamada do sistema.
strace -r ./stex
Os timestamps são exibidos no início de cada linha de saída.
Para ver a quantidade de tempo gasto em cada chamada do sistema, use o
-T.
(syscall-times). Isso mostra a duração do tempo gasto dentro de cada chamada do sistema.
strace -t ./stex
As durações de tempo são mostradas no final de cada linha de chamada do sistema.
Para ver a hora em que cada chamada de sistema foi chamada, use o
-tt.
Opção (timestamps absolutas). Isso mostra o tempo de "relógio de parede", com uma resolução microssegundo.
strace -tt ./stex
Os tempos são exibidos no início de cada linha.
Rastreando um processo de execução
Se o processo que você deseja rastrear já está sendo executado, você ainda pode anexar
strace.
para isso. Para fazer isso, você precisa saber o ID do processo. Você pode
usar
PS
com
grep.
para encontrar isso. Nós temos o Firefox em funcionamento. Para descobrir o id do
Raposa de fogo
processo, podemos usar
PS
e
tube it através de.
grep.
.
PS -E | grep firefox
Podemos ver que o ID do processo é 8483. Nós usaremos o
-p.
Opção (ID do processo) para contar
strace.
qual processo para anexar. Note que você precisará usar
sudo
:
Sudo Strace -P 8483
Você verá uma notificação de que
strace.
anexou-se ao processo e, em seguida, as chamadas de rastreamento do sistema serão exibidas na janela do terminal como de costume.
Criando um relatório
o
-c.
(somente resumo) opção provoca
strace.
para imprimir um relatório. Ele gera uma tabela para obter informações sobre as chamadas do sistema que foram feitas pelo programa traçado.
strace -c ./stex
As colunas são:
- % Tempo : A porcentagem do tempo de execução que foi gasto em cada chamada do sistema.
- segundos : O tempo total expresso em segundos e microssegundos gastos em cada chamada do sistema.
- USECS / Call. : O tempo médio em microssegundos gastos em cada chamada de 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.
Esses valores mostrarão zeros para programas triviais que executam 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.
Insights profundos, facilmente
o
strace.
A saída pode mostrar quais chamadas do sistema estão sendo feitas, quais estão sendo feitas repetidamente, e quanto tempo de execução está sendo gasto dentro do código do lado do kernel. Isso é ótima informação. Muitas vezes, quando você está tentando 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.
Usando
strace.
, você vê a foto completa.