실행 중인 프로세스에서 특정 파일 설명자의 읽기 활동을 모니터링하려고 합니다. 이것은 다양한 솔루션을 테스트하고 있는 C++ 테스트벤치입니다.
#include <fcntl.h>
#include <unistd.h>
#include <sys/stat.h>
#include <iostream>
int main()
{
const int fd1=open("/tmp/testfile", O_RDWR|O_CREAT);
const int fd2=open("/tmp/testfile", O_RDONLY);
write(fd1, "Hello, world!", 13);
std::cout << "PID: " << getpid() << ", fds: " << fd1 << "," << fd2 << "\n";
for(;;)
{
char b;
if(!read(fd1,&b, 1))
lseek(fd1,0,SEEK_SET);
}
}
일반적인 출력은 다음과 같습니다.
PID: 14992, fds: 3,4
그래서 strace를 사용하여 파일 설명자 3에서 읽은 내용을 추적해 보았습니다.
strace -p 14992 -e trace=none -e read=3
내가 받은 것은 메시지뿐이었고 strace: Process 14992 attached
그 이상은 아니었다. 모든 시스템 호출을 추적하면 read
많은 결과가 나옵니다.
$ strace -p 14992 -e trace=read
strace: Process 14992 attached
read(3, "", 1) = 0
read(3, "H", 1) = 1
read(3, "e", 1) = 1
read(3, "l", 1) = 1
read(3, "l", 1) = 1
read(3, "o", 1) = 1
read(3, ",", 1) = 1
read(3, " ", 1) = 1
<...>
그러나 strace 매뉴얼은 다음과 같이 말합니다 -e read=set
.
이는
read
-e Trace=read 옵션에 의해 제어되는 시스템 호출의 일반적인 추적과 무관하다는 점에 유의하십시오.
trace=none
그러므로 내 선택 사항과 read=3
관련이 없는 것은 추적하지 않는 것이 옳다고 생각합니다 .
분명히, 내가 뭔가 잘못하고 있습니다. 그렇다면 실제로 strace를 사용하여 read
시스템 호출 만 추적하려면 어떻게 해야 할까요 fd==3
? 필터링된 출력을 사용하면 grep
추적하려는 실제 애플리케이션의 속도가 느려지므로 옵션이 아닙니다.
답변1
맨페이지에서 인용한 문장을 어떻게 해석해야 할지 잘 모르겠지만 모든 추적을 비활성화하면 모든 read
추적도 비활성화됩니다. I/O 추적은 시스템 호출 추적 후에 발생합니다.저것활성화된 시스템 호출에서만 발생합니다.
strace -e trace=none -e read=3
"모든 시스템 호출 추적을 비활성화하고 파일 설명자 3에서 읽는 시스템 호출이 추적될 때마다 해당 I/O를 덤프합니다"를 의미합니다.
strace -e read -e read=3
파일 설명자 3에 대한 호출 read
과 파일 설명자 3에서 읽은 모든 정보를 표시하지만 read
일반 시스템 호출 추적은 전혀 필터링하지 않고 I/O 덤프만 필터링합니다.
즉, read=3
모든 추적 옵션은 필터링되지 않으며 파일 설명자 3에서 I/O 덤프 읽기를 요청합니다.
소스 코드를 보면 strace
원하는 것을 달성할 수 있는 방법이 없는 것 같습니다.