AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / unix / Perguntas / 436074
Accepted
Nathaniel M. Beaver
Nathaniel M. Beaver
Asked: 2018-04-07 12:26:56 +0800 CST2018-04-07 12:26:56 +0800 CST 2018-04-07 12:26:56 +0800 CST

Filtrar syscalls com falha do log strace

  • 772

Posso executar straceum 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 straceesse recurso está em andamento desde 2002 na forma de -zflag, 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 -Zflag, que é um alias para -e status=failed, disponível --failed-onlydesde a versão 5.6.

O -zsinalizador 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

    https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=176376

  • rastreando apenas syscalls com falha

    Criado: 2004-03-19

    https://sourceforge.net/p/strace/feature-requests/3/

  • [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

    https://github.com/strace/strace/issues/49

  • [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

strace system-calls
  • 3 3 respostas
  • 4054 Views

3 respostas

  • Voted
  1. Best Answer
    Stephen Kitt
    2018-05-31T23:40:41+08:002018-05-31T23:40:41+08:00

    Além de pós-processar a stracesaída, não há nada disponível para ignorar chamadas de sistema com falha em arquivos strace. Não seria muito difícil adicionar, veja a syscall_exiting_tracefunção em syscall.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 tracefileferramenta será executada stracee 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

    #!/usr/bin/env stap
    
    global stored_filename, stored_path
    
    probe syscall.open {
      stored_filename = filename
    }
    
    probe syscall.open.return {
      if (execname() == "cat" && $return >= 0) {
        printf("opened %s\n", stored_filename)
      }
    }
    
    probe syscall.openat {
      stored_filename = filename
      stored_path = dfd_str
    }
    
    probe syscall.openat.return {
      if (execname() == "cat" && $return >= 0) {
        printf("opened %s in %s\n", stored_filename, stored_path)
      }
    }
    

    mostrará o nome de qualquer arquivo aberto com sucesso por qualquer catprocesso.

    • 4
  2. Yurij Goncharuk
    2018-04-07T12:41:46+08:002018-04-07T12:41:46+08:00

    Solução possível:

    strace -e trace=file sleep 1 2>&1 | grep -v "= -1 ENOENT" > strace.log
    

    stracepor padrão imprime para stderrredirecioná-lo para stdout.

    • 3
  3. sourcejedi
    2018-04-08T01:00:11+08:002018-04-08T01:00:11+08:00

    Um padrão ligeiramente mais confiável (ou seja, um risco ligeiramente menor de pular as linhas erradas por acidente) pode ser

    | grep -v "= -1 ENOENT [(]No such file or directory[)]$"
    

    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 gdbscript personalizado. No entanto, isso dá mais trabalho e não tenho esse script preparado.

    Outra questão faz referência a um tracefilescript, que você executaria com a -eopção. Isso ainda é implementado analisando a saída de stracee, 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

    • 1

relate perguntas

  • Como posso determinar se uma latência é devida a um driver ou ao agendador?

  • O getauxval pode ser usado para determinar se você está sendo rastreado ou não?

  • O uso da função system () dentro do código C ++ é uma maneira rápida de usar códigos-fonte? [fechado]

  • bit de modo kernel

  • Necessidade de algumas chamadas de sistema

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Como exportar uma chave privada GPG e uma chave pública para um arquivo

    • 4 respostas
  • Marko Smith

    ssh Não é possível negociar: "nenhuma cifra correspondente encontrada", está rejeitando o cbc

    • 4 respostas
  • Marko Smith

    Como podemos executar um comando armazenado em uma variável?

    • 5 respostas
  • Marko Smith

    Como configurar o systemd-resolved e o systemd-networkd para usar o servidor DNS local para resolver domínios locais e o servidor DNS remoto para domínios remotos?

    • 3 respostas
  • Marko Smith

    Como descarregar o módulo do kernel 'nvidia-drm'?

    • 13 respostas
  • Marko Smith

    apt-get update error no Kali Linux após a atualização do dist [duplicado]

    • 2 respostas
  • Marko Smith

    Como ver as últimas linhas x do log de serviço systemctl

    • 5 respostas
  • Marko Smith

    Nano - pule para o final do arquivo

    • 8 respostas
  • Marko Smith

    erro grub: você precisa carregar o kernel primeiro

    • 4 respostas
  • Marko Smith

    Como baixar o pacote não instalá-lo com o comando apt-get?

    • 7 respostas
  • Martin Hope
    rocky Como exportar uma chave privada GPG e uma chave pública para um arquivo 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Wong Jia Hau ssh-add retorna com: "Erro ao conectar ao agente: nenhum arquivo ou diretório" 2018-08-24 23:28:13 +0800 CST
  • Martin Hope
    Evan Carroll status systemctl mostra: "Estado: degradado" 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim Como podemos executar um comando armazenado em uma variável? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S Por que /dev/null é um arquivo? Por que sua função não é implementada como um programa simples? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 Como ver as últimas linhas x do log de serviço systemctl 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - pule para o final do arquivo 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla Por que verdadeiro e falso são tão grandes? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis Substitua a string em um arquivo de texto enorme (70 GB), uma linha 2017-12-30 06:58:33 +0800 CST
  • Martin Hope
    Bagas Sanjaya Por que o Linux usa LF como caractere de nova linha? 2017-12-20 05:48:21 +0800 CST

Hot tag

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve