Um colega me disse uma vez que a última opção quando tudo falhou na depuração no Linux foi usar strace .
Tentei aprender a ciência por trás dessa ferramenta estranha, mas não sou um guru de administração de sistemas e não obtive resultados.
Assim,
- O que é exatamente e o que faz?
- Como e em que casos deve ser usado?
- Como a saída deve ser entendida e processada?
Em resumo, em palavras simples , como essas coisas funcionam?
man strace
muito fácil de ler e útil. (PS não sabia sobre strace antes de ontem e não um especialista em Linux)Respostas:
Visão geral do Strace O
strace pode ser visto como um depurador leve. Ele permite que um programador / usuário descubra rapidamente como um programa está interagindo com o sistema operacional. Isso é feito através do monitoramento de chamadas e sinais do sistema.
Usa
Bom para quando você não tem código-fonte ou não quer ser incomodado por realmente passar por ele.
Além disso, é útil para seu próprio código, se você não deseja abrir o GDB, mas está interessado apenas em entender a interação externa.
Uma boa introdução
a essa introdução para strace use outro dia: strace hello world
fonte
ltrace
stackoverflow.com/a/52012215/5884955-EFAULT
(oops, somente leitura buffer) ou-ENOENT
(oops, saiu correndo do diretório errado, onde o caminho relativo não funcionou)).Em palavras simples, o strace rastreia todas as chamadas do sistema emitidas por um programa junto com seus códigos de retorno. Pense em coisas como operações de arquivo / soquete e muito mais obscuras.
É mais útil se você tiver algum conhecimento prático de C, pois aqui as chamadas do sistema representariam com mais precisão as chamadas da biblioteca C padrão.
Digamos que seu programa seja / usr / local / bin / tosse. Basta usar:
ou
para escrever em 'out_file'.
Toda saída do strace irá para o stderr (cuidado, o grande volume dela geralmente exige um redirecionamento para um arquivo). Nos casos mais simples, seu programa será interrompido com um erro e você poderá ver onde foram as últimas interações com o SO na saída de rastreamento.
Mais informações devem estar disponíveis em:
fonte
O strace lista todas as chamadas do sistema feitas pelo processo ao qual é aplicada. Se você não souber o que significam as chamadas do sistema, não poderá obter muitas milhas com isso.
No entanto, se o seu problema envolver arquivos, caminhos ou valores do ambiente, executar o rastreio no programa problemático e redirecionar a saída para um arquivo e depois cumprimentá-lo pela sua cadeia de caminho / arquivo / env pode ajudá-lo a ver o que seu programa está realmente tentando diferente do que você esperava.
fonte
strace <prog_name>
rastrear um programa.strace -o <out_file> <prog_name>
colocar fora de arquivostrace -e open myprog
OR para todos os sys chamadas relacionadas arquivos:strace -e file myprog
Strace se destaca como uma ferramenta para investigar sistemas de produção em que você não pode dar ao luxo de executar esses programas em um depurador. Em particular, usamos strace nas duas situações a seguir:
Para um exemplo de análise usando strace, veja minha resposta a esta pergunta .
fonte
Uso strace o tempo todo para depurar problemas de permissão. A técnica é assim:
Onde
gnome-calculator
está o comando que você deseja executar.fonte
O strace -tfp PID monitorará as chamadas de sistema do processo PID, para que possamos depurar / monitorar o status do processo / programa.
fonte
Strace pode ser usado como uma ferramenta de depuração ou como um gerador de perfil primitivo.
Como depurador, você pode ver como determinadas chamadas do sistema foram chamadas, executadas e o que elas retornam. Isso é muito importante, pois permite ver não apenas que um programa falhou, mas POR QUE um programa falhou. Geralmente, é apenas o resultado de uma péssima codificação, que não captura todos os resultados possíveis de um programa. Outras vezes, são apenas caminhos codificados para os arquivos. Sem traços, você adivinha o que deu errado, onde e como. Com o strace, você obtém um detalhamento de um syscall, geralmente apenas observar um valor de retorno diz muito.
A criação de perfil é outro uso. Você pode usá-lo para cronometrar a execução de cada syscalls individualmente ou como um agregado. Embora isso possa não ser suficiente para solucionar seus problemas, ele diminuirá bastante a lista de possíveis suspeitos. Se você vir muitos pares de abrir / fechar em um único arquivo, provavelmente abrirá e fechará desnecessariamente arquivos a cada execução de um loop, em vez de abrir e fechá-lo fora de um loop.
Ltrace é primo íntimo de Strace, também muito útil. Você deve aprender a diferenciar onde está o seu gargalo. Se uma execução total é de 8 segundos e você gasta apenas 0,05seg em chamadas do sistema, rastrear o programa não será muito bom, o problema está no seu código, que geralmente é um problema de lógica ou o programa realmente precisa levar tanto tempo para correr.
O maior problema com strace / ltrace é ler a saída deles. Se você não souber como as chamadas são feitas, ou pelo menos os nomes de syscalls / functions, será difícil decifrar o significado. Saber o que as funções retornam também pode ser muito benéfico, especialmente para diferentes códigos de erro. Embora seja difícil decifrar, às vezes eles realmente retornam uma pérola de conhecimento; Depois que vi uma situação em que fiquei sem inodes, mas não com espaço livre, todos os utilitários comuns não me deram nenhum aviso, simplesmente não consegui criar um novo arquivo. A leitura do código de erro da saída do strace me apontou na direção certa.
fonte
Strace é uma ferramenta que informa como o aplicativo interage com o sistema operacional.
Isso é feito, informando como o sistema operacional chama seu aplicativo e com quais parâmetros ele os chama.
Por exemplo, você vê quais arquivos o seu programa tenta abrir e aguarda a chamada com êxito.
Você pode depurar todos os tipos de problemas com esta ferramenta. Por exemplo, se o aplicativo disser que não consegue encontrar a biblioteca que você sabe que instalou, o strace dirá onde o aplicativo está procurando esse arquivo.
E isso é apenas uma ponta do iceberg.
fonte
O strace é uma boa ferramenta para aprender como o seu programa faz várias chamadas do sistema (solicitações ao kernel) e também relata as que falharam, juntamente com o valor do erro associado a essa falha. Nem todas as falhas são erros. Por exemplo, um código que está tentando procurar um arquivo pode receber um erro ENOENT (sem esse arquivo ou diretório), mas esse pode ser um cenário aceitável na lógica do código.
Um bom caso de uso do strace é depurar condições de corrida durante a criação temporária de arquivos. Por exemplo, um programa que pode estar criando arquivos anexando o ID do processo (PID) a alguma sequência predeterminada pode enfrentar problemas em cenários com vários segmentos. [Um PID + TID (identificação do processo + identificação da thread) ou uma chamada de sistema melhor, como mkstemp, corrigirá isso].
Também é bom para falhas de depuração. Você pode encontrar este (meu) artigo sobre falhas de strace e depuração úteis.
fonte
Exemplo mínimo executável
Se um conceito não estiver claro, há um exemplo mais simples que você ainda não viu que o explica.
Nesse caso, esse exemplo é o hello world independente do assembly Linux x86_64:
ola.S
GitHub upstream .
Montar e executar:
Produz o esperado:
Agora vamos usar strace nesse exemplo:
Nós usamos:
env -i ASDF=qwer
para controlar as variáveis de ambiente: /unix/48994/how-to-run-a-program-in-a-clean-environment-in-bash-s999 -v
para mostrar informações mais completas nos logsstrace.log
agora contém:Com um exemplo tão minimalista, todos os caracteres da saída são evidentes:
execve
line: mostra como éstrace
executadohello.out
, incluindo argumentos e ambiente da CLI, conforme documentado emman execve
write
linha: mostra a chamada do sistema de gravação que fizemos.6
é o comprimento da string"hello\n"
.= 6
é o valor de retorno da chamada do sistema, que conforme documentadoman 2 write
é o número de bytes gravados.exit
line: mostra a chamada do sistema de saída que fizemos. Não há valor de retorno, pois o programa foi encerrado!Exemplos mais complexos
A aplicação do strace é, obviamente, para ver quais chamadas do sistema os programas complexos estão realmente fazendo para ajudar a depurar / otimizar seu programa.
Notavelmente, a maioria das chamadas de sistema que você provavelmente encontrará no Linux possui wrappers glibc, muitas delas do POSIX .
Internamente, os wrappers glibc usam montagem inline mais ou menos assim: Como chamar uma chamada de sistema via sysenter na montagem inline?
O próximo exemplo que você deve estudar é um
write
hello world POSIX :main.c
Compile e execute:
Desta vez, você verá que várias chamadas de sistema estão sendo feitas pela glibc antes
main
para configurar um ambiente agradável para main.Isso ocorre porque agora não estamos usando um programa independente, mas um programa glibc mais comum, que permite a funcionalidade libc.
Então, em cada extremidade,
strace.log
contém:Portanto, concluímos que a
write
função POSIX usa, surpresa !, awrite
chamada de sistema Linux .Também observamos que
return 0
leva a umaexit_group
chamada em vez deexit
. Ha, eu não sabia sobre este! É porstrace
isso que é tão legal.man exit_group
então explica:E aqui está outro exemplo em que estudei qual chamada de sistema
dlopen
usa: /unix/226524/what-system-call-is-used-to-load-libraries-in-linux/462710#462710Testado no Ubuntu 16.04, GCC 6.4.0, kernel do Linux 4.4.0.
fonte
Aqui estão alguns exemplos de como uso o strace para acessar sites. Espero que isso seja útil.
Verifique a hora do primeiro byte da seguinte forma:
Veja qual porcentagem de ações está fazendo o que. Muitos
lstat
efstat
podem ser uma indicação de que é hora de limpar o cache:Saída
trace.txt
para que você possa ver exatamente quais chamadas estão sendo feitas.Usar isso para verificar se alguma coisa levou entre
.1
a.9
de um segundo para carregar:Veja quais arquivos ou diretórios ausentes foram capturados no
strace
. Isso produzirá muitas coisas envolvendo nosso sistema - os únicos bits relevantes envolvem os arquivos do cliente:fonte
Eu gostei de algumas respostas onde se lê
strace
verificando como você interage com seu sistema operacional.É exatamente isso que podemos ver. O sistema chama. Se você comparar
strace
eltrace
a diferença é mais óbvia.Por outro lado, há
ltrace
que rastreia funções.Embora tenha verificado os manuais várias vezes, não encontrei a origem do nome
strace
mas é provável o rastreamento de chamadas do sistema, pois isso é óbvio.Existem três notas maiores para dizer sobre
strace
.Nota 1: Ambas as funções
strace
eltrace
estão usando a chamada do sistemaptrace
. Portantoptrace
, a chamada do sistema é efetivamente comostrace
funciona.Nota 2: Existem diferentes parâmetros com os quais você pode usar
strace
, poisstrace
podem ser muito detalhados. Eu gosto de experimentar o-c
que é como um resumo das coisas. Com base em-c
você pode selecionar uma chamada de sistema como a-e trace=open
que você verá apenas essa chamada. Isso pode ser interessante se você estiver examinando quais arquivos serão abertos durante o comando que você está rastreando. E, é claro, você pode usar ogrep
mesmo objetivo, mas observe que precisa redirecionar assim2>&1 | grep etc
para entender que os arquivos de configuração são referenciados quando o comando foi emitido.Nota 3: Acho esta nota muito importante. Você não está limitado a uma arquitetura específica.
strace
vai impressionar você, pois ele pode rastrear binários de diferentes arquiteturas.fonte