Posso executar strace
um comando como sleep 1
e ver quais arquivos ele está acessando assim:
strace -e trace=file -o strace.log sleep 1
No entanto, na minha máquina, muitas das chamadas têm um valor de retorno de -1, indicando que o arquivo não existe. Por exemplo:
$ grep '= -1 ENOENT' strace.log | head
access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)
access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory)
access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)
open("/usr/lib/locale/locale-archive", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
open("/usr/lib/locale/en_US.UTF-8/LC_IDENTIFICATION", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
open("/usr/lib/locale/en_US.UTF-8/LC_MEASUREMENT", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
open("/usr/lib/locale/en_US.UTF-8/LC_TELEPHONE", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
open("/usr/lib/locale/en_US.UTF-8/LC_ADDRESS", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
open("/usr/lib/locale/en_US.UTF-8/LC_NAME", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
open("/usr/lib/locale/en_US.UTF-8/LC_PAPER", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
Não estou realmente interessado nos arquivos que não existem, quero saber quais arquivos o processo realmente encontrou e leu. Além de grep -v '=-1 ENOENT'
, como posso filtrar com segurança as chamadas com falha?
Termo aditivo
Fiquei surpreso ao saber que strace
esse recurso está em andamento desde 2002 na forma de -z
flag, que é um alias para -e status=successful
, totalmente funcional desde a versão 5.2
( 2019-07-12 ), também disponível --successful-only
desde a versão 5.6 ( 2020- 04-07 ).
Também disponível desde a versão 5.2 está o complemento de -z
, o -Z
flag, que é um alias para -e status=failed
, disponível --failed-only
desde a versão 5.6.
O -z
sinalizador foi adicionado pela primeira vez em um commit de 2002 e lançado na versão 4.5.18 ( 2008-08-28 ), mas nunca foi documentado porque não estava funcionando corretamente.
links relevantes:
vendo apenas chamadas de sistema bem-sucedidas
Sáb 2 de novembro 23:07:23 UTC 2002
Ao usar o strace, às vezes gosto de ver as chamadas do sistema que funcionam (em vez de todas as chamadas do sistema).
Eu tenho portado este patch por anos, parece muito útil.
Com a opção -z, você não vê aberturas em arquivos que não existem (muito útil para rastrear o que um programa realmente faz, em vez de tentar fazer).
https://lists.strace.io/pipermail/strace-devel/2002-November/000232.html
strace: a opção -z não funciona corretamente
Data: Dom, 12 de janeiro de 2003 09:33:01 UTC
rastreando apenas syscalls com falha
Criado: 2004-03-19
[strace-4.15] Proposta: Staging de saída para a opção -z (apenas syscalls de impressão bem-sucedida) / Patch incluído
Terça-feira, 17 de janeiro 09:35:54 UTC 2017
https://lists.strace.io/pipermail/strace-devel/2017-January/005941.html
[PATCH v1] Preparação de saída implementada para syscalls com falha/bem-sucedida
Qua, 18 de janeiro 16:01:20 UTC 2017
https://lists.strace.io/pipermail/strace-devel/2017-January/005950.html
Corrigir opção -z
28 de fevereiro de 2018
[PATCH 0/3] Saída de palco para -ze novas opções -Z
Segunda-feira, 1 de abril 21:13:02 UTC 2019
https://lists.strace.io/pipermail/strace-devel/2019-April/008706.html
sinalizador strace -z
Segunda-feira, 10 de junho 05:29:19 UTC 2019
https://lists.strace.io/pipermail/strace-devel/2019-June/008808.html
Além de pós-processar a
strace
saída, não há nada disponível para ignorar chamadas de sistema com falha em arquivosstrace
. Não seria muito difícil adicionar, veja asyscall_exiting_trace
função emsyscall.c
.Se você preferir seguir o ângulo de pós-processamento, Ole Tange já cuidou disso para você de uma maneira mais abrangente do que você provavelmente encontrará aqui: a
tracefile
ferramenta será executadastrace
e filtrará as informações que você procura em uma forma bem legível. Consulte Listar os arquivos acessados por um programa para obter detalhes. Outra resposta a essa pergunta lista outras abordagens possíveis, incluindo LoggedFS , que considero muito útil.Outra opção é usar o SystemTap ; por exemplo
mostrará o nome de qualquer arquivo aberto com sucesso por qualquer
cat
processo.Solução possível:
strace
por padrão imprime parastderr
redirecioná-lo parastdout
.Um padrão ligeiramente mais confiável (ou seja, um risco ligeiramente menor de pular as linhas erradas por acidente) pode ser
Ou seja, copie e cole o final da linha, "escapando" os colchetes (que podem ser tratados como caracteres especiais) e adicione o caractere especial
$
ao final que "ancora" o padrão ao final da linha.Não consigo encontrar nenhuma opção melhor em
man strace
. Hacks de manipulação de texto rápidos e sujos são o estilo Unix :-P.É quase certo que seja possível fazer o que você deseja com um
gdb
script personalizado. No entanto, isso dá mais trabalho e não tenho esse script preparado.Outra questão faz referência a um
tracefile
script, que você executaria com a-e
opção. Isso ainda é implementado analisando a saída destrace
e, portanto, também não parece totalmente confiável, mas acho que é possível que você prefira. https://gitlab.com/ole.tange/tangetools/blob/master/tracefile/tracefile