
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
깃발 -z
은2002년 제출에 처음 추가됨버전 4.5.18(2008-08-28), 다소 결코파일에 기록하다제대로 작동하지 않기 때문이죠.
관련된 링크들:
성공한 시스템 호출만 확인
2002년 11월 2일 토요일 23:07:23 UTC
strace를 사용할 때 나는 때때로 (모든 시스템 호출이 아닌) 유효한 시스템 호출을 보고 싶어합니다.
나는 수년 동안 이 패치를 이식해 왔으며 매우 유용한 것 같습니다.
-z 옵션을 사용하면 존재하지 않는 파일이 열리는 것을 볼 수 없습니다(프로그램을 시도하기보다는 실제로 수행하는 작업을 추적하는 데 유용합니다).
https://lists.strace.io/pipermail/strace-devel/2002-November/000232.html
strace: -z 옵션이 제대로 작동하지 않습니다.
날짜: 2003년 1월 12일 일요일 09:33:01 UTC
실패한 시스템 호출만 추적
작성시간 : 2004-03-19
[strace-4.15] 제안: -z 옵션에 대한 출력 준비(성공적인 시스템 호출만 인쇄)/패치 포함
2017년 1월 17일 화요일 09:35:54 UTC
https://lists.strace.io/pipermail/strace-devel/2017-January/005941.html
[PATCH v1] 실패/성공적인 시스템 호출에 대한 출력 스테이징을 구현했습니다.
2017년 1월 18일 수요일 16:01:20 UTC
https://lists.strace.io/pipermail/strace-devel/2017-January/005950.html
-z 옵션 수정
2018년 2월 28일
[PATCH 0/3] -z 및 새로운 -Z 옵션에 대한 단계 출력
2019년 4월 1일 월요일 21:13:02 UTC
https://lists.strace.io/pipermail/strace-devel/2019-April/008706.html
strace -z 플래그
2019년 6월 10일 월요일 05:29:19 UTC
https://lists.strace.io/pipermail/strace-devel/2019-June/008808.html
답변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