実行中のプロセスで特定のファイル記述子の読み取りアクティビティを監視しようとしています。これはさまざまなソリューションをテストしている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
欲しいものを達成する方法がないようです。