부록

부록

strace비슷한 명령을 실행 sleep 1 하고 다음과 같이 어떤 파일에 액세스하는지 확인할 수 있습니다.

strace -e trace=file -o strace.log sleep 1

그러나 내 컴퓨터에서는 많은 호출이 -1 값을 반환하여 파일이 존재하지 않음을 나타냅니다. 예를 들어:

$ 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)

나는 존재하지 않는 파일에는 별로 관심이 없고, 프로세스가 실제로 어떤 파일을 찾아 읽었는지 알고 싶습니다. 이것을 제외하고 grep -v '=-1 ENOENT'실패한 통화를 어떻게 안정적으로 필터링할 수 있습니까 ?

부록

이 기능이 2002년부터 의 별칭인 strace로고 형태로 모든 기능을 수행했다는 사실을 알고 놀랐습니다.-z-e status=successful버전 5.2부터 (2019-07-12), 다음으로도 사용 가능--successful-only 버전 5.6부터(2020-04-07).

-z-Z버전 5.2부터 사용 가능한 이 플래그는 버전 5.6부터 사용 가능한 의 별칭인 를 보완합니다 -e status=failed.--failed-only

깃발 -z2002년 제출에 처음 추가됨버전 4.5.18(2008-08-28), 다소 결코파일에 기록하다제대로 작동하지 않기 때문이죠.

관련된 링크들:

답변1

출력을 사후 처리하는 것 외에는 strace무시할 수 있는 것이 없습니다 strace. 추가하는 것은 그리 어렵지 않습니다. syscall_exiting_trace내부 기능을 살펴보세요.syscall.c.

후처리 관점을 추구하려는 경우올레 데인저이 질문은 여기에서 볼 수 있는 것보다 더 포괄적인 방식으로 해결되었습니다.tracefile이 도구는 strace읽기 쉬운 형식으로 작동하며 원하는 정보를 필터링합니다. 바라보다프로그램에서 액세스하는 파일 나열더 알아보기.또 다른 대답이 문제에 대해 나열된 다른 가능한 접근 방식은 다음과 같습니다.로깅 파일 시스템나는 이것이 매우 유용하다고 생각합니다.

또 다른 옵션은 다음을 사용하는 것입니다.시스템 클릭;예를 들어

#!/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)
  }
}

모든 프로세스에서 성공적으로 열린 파일의 이름이 표시됩니다 cat.

답변2

가능한 해결책:

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

strace기본적으로는 으로 인쇄되므로 stderr로 리디렉션됩니다 stdout.

답변3

약간 더 안정적인 모드(예: 실수로 잘못된 줄을 건너뛸 위험이 약간 적음)는

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

즉, 줄 끝을 복사하여 붙여넣고 대괄호(그렇지 않으면 특수 문자로 처리될 수 있음)를 "이스케이프"하고 $끝에 특수 문자를 추가하여 패턴을 줄 끝에 "고정"합니다.

에서 더 나은 선택을 찾을 수 없습니다 man strace. 빠르고 더러운 텍스트 조작 트릭은 Unix 방식입니다 :-P.

gdb원하는 것을 달성하기 위해 사용자 정의 스크립트를 사용하는 것이 거의 확실합니다 . 하지만 더 많은 작업이 필요하고 아직 그런 대본을 준비하지 않았습니다.

또 다른 질문은 이 옵션을 사용하여 실행할 tracefile수 있는 스크립트 에 관한 것입니다 . -e이는 여전히 구문 분석된 출력을 통해 수행되므로 strace완전히 신뢰할 수는 없지만 여러분이 선호할 것이라고 생각했습니다. https://gitlab.com/ole.tange/tangetools/blob/master/tracefile/tracefile

관련 정보