프로세스 실행을 안정적이고 투명하게 추적하는 방법

프로세스 실행을 안정적이고 투명하게 추적하는 방법

전부는 아니지만 대부분의 패키지를 컴파일하는 동안 stdout 및 stderr의 출력은 여러 개별 프로세스에 의해 생성되며 빌드 중에 처리/변경/생성된 파일도 여러 다른 프로세스에서 처리하여 생성됩니다. 이는 (아마 대부분의) 패키지 빌드 시스템이 최종 빌드 결과를 생성하기 위해 여러 가지 소프트웨어 조각에 의존하기 때문입니다.

Linux(또는 BSD)에서 빌드 프로세스를 투명하게 추적하여 다음 정보를 검색할 수 있다면 매우 유용할 것입니다.

  • 어떤 프로세스가 stdout 및 stderr에 어떤 정보를 생성했는지(그리고 해당 프로세스의 조상은 무엇입니까)
  • 파일을 읽는 프로세스
  • 어떤 프로세스가 파일에 쓰고 있나요?

이 정보는 다음 사항에 도움이 됩니다.

  • 병렬로 실행되는 빌드에 대해서도 선형화된 빌드 로그 생성
  • 입력 소스 파일을 출력 바이너리와 자동으로 연결할 수 있습니다.
  • 임베디드 코드 사본 감지
  • GPL 준수 확인(이제 어떤 파일이 서로 연결되어 있는지 알 수 있으므로)
  • 생성된 바이너리에 어떤 라이센스가 적용되는지 확인합니다(생성하는 데 어떤 소스 파일이 사용되었는지 알고 있으므로).

프로그램 실행을 추적하는 또 다른 방법은 파일을 생성하거나 변경하는 각 프로그램을 수정하고 모두 기계가 읽을 수 있는 균일한 출력 형식을 갖도록 하는 것입니다. 소프트웨어 컴파일(다양한 언어용 컴파일러, 문서 생성기, 이미지 변환기, 심지어 sed, grep, cp 또는 mv와 같은 Unix 명령)에 관련된 프로그램 수를 고려하면 이는 실현 가능하지 않습니다.

Linux는 프로세스와 모든 하위 프로세스에서 수행된 모든 시스템 호출을 추적하는 여러 가지 방법을 제공합니다. 그러나 ptrace 또는 LD_PRELOAD 기반 메커니즘은 일부 빌드에 영향을 미치므로 두 방법 중 하나로 추적되지 않을 때와는 실패하거나 다른 결과가 생성됩니다. systemtap은 수동적으로만 수신 대기하고 이벤트가 너무 빨리 발생하더라도 프로세스 속도를 늦추지 않기 때문에 일반적으로 검색을 건너뜁니다.

그래서 저는 프로세스와 모든 하위 항목에 완전히 투명한 방식으로(실행 시간에 영향을 줄 수 있다는 점 제외) 프로세스와 모든 하위 항목이 수행한 시스템 호출을 안정적으로 추적할 수 있는 방법을 찾고 있습니다.

Linux(또는 BSD)에서 이것이 가능합니까? 그렇다면 어떻게?

관련 정보