strace -e read=fd 옵션을 올바르게 사용하는 방법은 무엇입니까?

strace -e read=fd 옵션을 올바르게 사용하는 방법은 무엇입니까?

실행 중인 프로세스에서 특정 파일 설명자의 읽기 활동을 모니터링하려고 합니다. 이것은 다양한 솔루션을 테스트하고 있는 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원하는 것을 달성할 수 있는 방법이 없는 것 같습니다.

관련 정보