Como rastrear chamadas de sistema feitas por um processo com Strace no Linux
- 4024
- 719
- Spencer Emard
Há momentos em que é útil inspecionar o que um aplicativo em execução está fazendo sob o capô e o que o sistema chama de execução durante sua execução. Para realizar essa tarefa no Linux, podemos usar o strace Utilitário. Neste artigo, veremos como instalá -lo e aprenderemos seu uso básico.
Neste tutorial, você aprenderá:
- Como instalar o Strace
- Como usar o Strace para rastrear chamadas de sistema feitas por um processo
- Como filtrar chamadas do sistema de especificações
- Como anexar a um processo já em execução
- Como gerar um resumo de chamada de sistema
Requisitos de software e convenções usadas
Categoria | Requisitos, convenções ou versão de software usada |
---|---|
Sistema | Independente da distribuição |
Programas | Strace |
Outro | Familiaridade com a interface da linha de comando e gerenciamento de processos Linux |
Convenções | # - linux -commands a serem executados com privilégios de raiz diretamente como usuário root ou por uso de sudo comando$-Linux-commands para serem executados como um usuário não privilegiado regular |
Instalação
Embora não esteja instalado por padrão, o strace A utilidade está disponível nos repositórios oficiais de todas as principais distribuições Linux; Isso significa que podemos instalá -lo com muita facilidade usando nosso gerenciador de pacotes favorito.
Se estivermos correndo no Fedora (ou em qualquer outra distribuição na família Red Hat), por exemplo, devemos usar DNF:
$ sudo dnf install strace
Se nos sentirmos mais confortáveis usando distribuições de Debian ou Debian, como Ubuntu ou Linux Mint, podemos usar apt Para alcançar o mesmo resultado:
$ sudo apt install strace
Se o Arch Linux é a nossa distribuição de escolha, podemos usar Pacman Para instalar o aplicativo, que está disponível no extra repositório:
$ sudo pacman -s strace
Com o software instalado, podemos prosseguir e ver alguns exemplos de seu uso.
Apresentando Strace
Como já dissemos, strace é uma ferramenta usada para acompanhar as chamadas do sistema feitas por um processo em execução e os sinais recebidos por ele. As chamadas do sistema são a interface fundamental entre um aplicativo e o kernel Linux; Quando usamos strace, O nome das chamadas feitas por um processo, juntamente com seus argumentos e valores de retorno, são exibidos em stderr (Descritor de arquivo de erro padrão).
Vamos ver um uso básico de strace, Para se familiarizar com sua saída. Em seu uso mais básico, chamamos strace seguido pelo programa que queremos executar e quem o comportamento que queremos analisar. Para o bem deste exemplo, apenas copiaremos um arquivo usando o cp comando:
$ strace cp ~/.Bashrc Bashrc
A saída do comando é bastante longa e, é claro, aqui não podemos analisá -lo em detalhes; Vamos apenas ver a primeira linha. Cada linha no strace A saída contém:
- O nome do sistema de chamada
- Os argumentos passados para a chamada do sistema entre parênteses
- O valor do retorno da chamada do sistema
A primeira chamada do sistema que podemos ver na saída é execve
. Esta chamada é usada para executar um programa com uma variedade especificada de argumentos. O primeiro argumento aceito por EXECV
é o caminho do arquivo que queremos executar; O segundo é uma variedade de cordas que representa os argumentos que serão passados para o programa (o primeiro argumento, por convenção, sendo o nome do próprio programa).
No nosso caso, como esperado, o binário chamado é /usr/bin/cp
, E a variedade de argumentos passados para a chamada é: o nome do programa (CP), a fonte e os caminhos de destino:
execve ("/usr/bin/cp", ["cp", "/home/egdoc/.Bashrc "," Bashrc "], 0x7fff53d4e4c0 / * 46 vars * /) = 0
O / * 46 vars */
notação significa que 46 variáveis foram herdadas do processo de chamada (no EXECV
função O ambiente é retirado do externo Environ
variável). Finalmente, temos o valor de retorno, que neste caso é 0
(na verdade exec
A família de função retorna um valor apenas se ocorrer um erro).
Filtrando apenas chamadas específicas do sistema
Ao usar strace Às vezes, podemos querer acompanhar apenas as chamadas do sistema específicas feitas por um processo. Nessas situações, podemos usar o -e
opção seguida por uma expressão que indica o que o sistema chama deve ser rastreado. Suponha que executamos o mesmo comando que usamos no exemplo anterior, mas queremos apenas o ler
Chamadas de sistema a serem exibidas na saída, nós executaríamos:
$ strace -e leia cp ~/.Bashrc Bashrc
Como esperado, apenas ler
As chamadas são relatadas:
ler
A chamada do sistema leva três argumentos: o primeiro é um Descritor de arquivo associado ao arquivo que deve ser lido; o segundo é o amortecedor no qual o arquivo deve ser lido e o terceiro é o Número de bytes isso deve ser lido. No sucesso, a função retorna o número de bytes lidos do arquivo, como podemos observar na saída do acima. Anexando Strace em um processo de corrida
Até agora nós invocamos strace passando a ele o comando a ser executado e para acompanhar; E se quisermos rastrear um processo existente e já em execução? Nesse caso, devemos invocar strace com o -p
(ou --anexar
) opção e passar o PID (ID do processo) do processo que queremos anexá -lo.
Para encontrar o PID de um programa, entre as outras soluções, podemos usar o pidof Utilitário. Para o bem deste exemplo, anexaremos Strace a uma instância em execução de Servidor Gnome-terminal:
$ pidof gnome-terminal server 121316
O pidof comando retornado 121316
, que é o PID do GNOME-Terminal-Server. Sabendo disso, podemos anexar strace para o processo:
$ strace -p 121316
O comando acima inicialmente retornará algo como:
A saída do comando “Strace -P 121316” a saída acima (truncada) será atualizada “na mosca”, à medida que as chamadas do sistema são executadas. Para separar" strace Podemos simplesmente pressionarCtrl+c
no teclado; Seremos notificados do "desapego", mas o processo rastreado continuará a ser executado: Strace: Processo 121316 destacado
Sinais de rastreamento
Graças a strace Também podemos observar quando um processo recebe um sinal e como ele reage a ele. Deixe -me demonstrar isso. Primeiro, lançamos um processo de longa execução como principal, que é um monitor de processo:
$ top
Nós que prendemos strace para ele, depois de obter seu PID, o que neste caso é 44825
:
$ strace -p 44825
Neste ponto strace começa a rastrear as chamadas do sistema feitas por principal, mas também os sinais recebidos por ele. Para provar, enviamos um Sigterm para pid 44825
:
$ Kill 44825
Como esperado, o evento é relatado no strace saída:
--- Sigterm Si_signo = sigterm, Si_code = Si_user, Si_pid = 44888, Si_uid = 1000 ---
Na saída acima si_signo está o número de sinal que está sendo entregue (sigterm = 15), Si_code Contém um código que identifica a causa do sinal (Si_User = 0): neste caso, o sinal foi gerado por um processo do usuário. O Si_pid e si_uid Relatório de campos, respectivamente, o PID do processo de envio e seu Uid.
Salve a saída de Strace em um arquivo
Se usarmos o -o
opção (abreviação de --OPUT
) ao lançar strace, Podemos redirecionar sua saída para um arquivo, passando um caminho como argumento, por exemplo:
$ strace -p 121316 -o strace_output strace: Processo 121316 anexado
O strace_output
o arquivo será criado e a saída de strace será escrito dentro dele. Para assistir à atualização no arquivo, podemos usar o cauda: Normalmente, este comando lê as últimas 10 linhas de um arquivo e sai, mas se o chamarmos com o -f
opção (abreviação de --seguir
) Podemos observar como novo conteúdo é anexado:
$ cauda -f strace_output
Imprima um resumo das chamadas do sistema
O strace O utilitário vem com um recurso muito útil: a capacidade de gerar um resumo de todas as chamadas do sistema feitas por um processo especificado. Se queremos gerar esse relatório, tudo o que precisamos fazer é invocar o programa com o -c
ou --somente resumo
opção. Vamos dar como exemplo o cp Comando que usamos antes:
$ strace -c cp ~/.Bashrc Bashrc
O comando acima gerará este relatório:
% tempo segundos usecs/chamadas erros syscall ------ ------------- ----------- --------- ---- ------ ---------------- 25.71 0.000298 7 38 13 OpenAt 19.24 0.000223 4 51 Mmap 11.48 0.000133 4 28 Fechar 9.92 0.000115 57 2 1 newfstatat 7.94 0.000092 10 9 MProtect 6.99 0.000081 3 25 FSTAT 2.85 0.000033 3 11 Leia 2.76 0.000032 16 2 Munmap 2.50 0.000029 14 2 Statfs 1.90 0.000022 22 1 Escreva 1.55 0.000018 2 8 PREAD64 1.38 0.000016 8 2 1 acesso 1.04 0.000012 4 3 BRK 0.78 0.000009 4 2 rt_sigaction 0.60 0.000007 7 1 Futex 0.52 0.000006 3 2 1 arch_prctl 0.43 0.000005 5 1 rt_sigprocMask 0.43 0.000005 5 1 set_tid_address 0.43 0.000005 5 1 Fadvise64 0.43 0.000005 5 1 set_robust_list 0.43 0.000005 5 1 Prlimit64 0.26 0.000003 3 1 1 Stat 0.26 0.000003 3 1 1 LSEEK 0.17 0.000002 2 1 getEuid 0.00 0.000000 0 1 Execve ------ ----------- ----------- --------- --------- ---------------- 100.00 0.001159 5 196 18 Total
Como você pode ver, uma vez que geramos um resumo, a saída normal de strace não é exibido. Se queremos gerar o resumo, mas ainda obter a saída regular do programa, devemos usar o -C
opção em vez disso, que é a forma curta de --resumo
.
Conclusões
Neste tutorial, aprendemos a instalar e usar strace, Uma boa utilidade útil para fins de depuração e, mais geralmente, para acompanhar as chamadas do sistema executadas por um processo. Vimos como a saída de strace está organizado, como lançar um programa e acompanhar as chamadas do sistema que ele faz, como anexar strace para um processo já em execução e como os sinais recebidos por um processo são notificados; Finalmente, vimos como gerar um resumo de todas as chamadas feitas por um processo. Aqui mal arranhamos a superfície do que podemos fazer com strace: se você quiser saber mais sobre isso, o conselho é, como sempre, ler o manual!
Tutoriais do Linux relacionados:
- Coisas para instalar no Ubuntu 20.04
- Coisas para fazer depois de instalar o Ubuntu 20.04 fossa focal linux
- Arquivos de configuração do Linux: os 30 primeiros mais importantes
- Uma introdução à automação, ferramentas e técnicas do Linux
- Coisas para instalar no Ubuntu 22.04
- Sistema Linux Hung? Como escapar para a linha de comando e…
- Como usar o comando tcpdump no Linux
- Linux pode obter vírus? Explorando a vulnerabilidade do Linux…
- Coisas para fazer depois de instalar o Ubuntu 22.04 Jellyfish…
- Mint 20: Melhor que o Ubuntu e o Microsoft Windows?