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欲しいものを達成する方法がないようです。

関連情報