Como rastrear de forma confiável e transparente a execução do processo

2

Durante a compilação da maioria dos pacotes de software (se não todos), a saída em stdout e stderr é criada por vários processos individuais e os arquivos processados / alterados / criados no decorrer de uma compilação são manipulados por vários processos diferentes, como bem. Isso ocorre porque os sistemas de compilação dos pacotes de software (provavelmente a maioria) dependem de vários softwares diferentes para produzir o resultado final da compilação.

Seria muito útil se um processo de compilação no Linux (ou um BSD) pudesse ser rastreado de forma transparente, de modo que se pudesse recuperar as seguintes informações:

  • qual foi o processo que produziu quais informações sobre stdout e stderr (e quais são os ancestrais desse processo)
  • qual foi o processo que leu um determinado arquivo
  • qual foi o processo que estava escrevendo um determinado arquivo

Esta informação seria útil para:

  • gera logs de construção linearizados, mesmo para construções que foram realizadas em paralelo
  • permite associar automaticamente arquivos de origem de entrada a binários de saída
  • detectar cópias de código incorporadas
  • verifique a conformidade com a GPL (porque agora sabemos quais arquivos foram vinculados)
  • descubra a licença que se aplica ao binário criado (porque sabemos quais arquivos de origem foram usados para produzi-lo)

A alternativa para fazer esse rastreamento da execução do programa seria modificar cada programa que produz ou altera arquivos e fazer com que todos tenham um formato de saída legível por máquina unificada. Dados quantos programas estão envolvidos na compilação de software (compiladores para diferentes linguagens, geradores de documentação, conversores de imagens ou até mesmo comandos Unix como sed, grep, cp ou mv) isso é inviável.

O Linux fornece algumas maneiras de rastrear todas as chamadas do sistema feitas por um processo e por todos os seus filhos. Mas os mecanismos baseados em ptrace ou LD_PRELOAD influenciam algumas construções de maneira que elas falharão ou produzirão resultados diferentes em comparação com quando não forem rastreadas por nenhum dos métodos. E o systemtap, muitas vezes, ignora os probes, pois é apenas escutar passivamente e não retardar um processo se os eventos ocorrerem muito rápido.

Então, o que eu estou procurando é uma forma de rastrear com confiança as chamadas do sistema feitas por um processo e todos os seus filhos de uma maneira completamente transparente (exceto que isso provavelmente influenciará o tempo de execução) para o processo e todas as suas crianças.

Isso é possível no Linux (ou BSD)? Se sim, como?

    
por josch 08.03.2015 / 09:47

0 respostas

Tags