strace は、プロセス間通信の問題を解決するために使用されます。

strace は、プロセス間通信の問題を解決するために使用されます。

次のコマンドを使用して出力をキャプチャしました。

strace -f -e trace=process,socketpair,open,close,dup,dup2,read,write -o rsync.log rsync -avcz --progress src/ dst/

少し長く上げてみました。ここ。出力の基本形式strace(たとえば、次の行)を理解します。

1399 open("/lib/x86_64-linux-gnu/libpopt.so.0", O_RDONLY|O_CLOEXEC) = 3

意味は次のとおりです

  1. 1399プロセスのPID
  2. open(const char *pathname, int flags);特定のパラメータを含むシステムコール(man 2 open次から取得)。
  3. 3戻り値です。この特別な場合は、ファイル記述子(から取得 man 2 open)です。

~によるとこれワイヤー:

rsyncコピーを実行するために2つのプロセス/スレッドを作成します。 1 つはプロセス間でデータをストリーミングし、もう 1 つは受信プロセスから宛先ファイルにデータをストリーミングします。

このようなものを使用すると、strace -e trace=process,socketpair,open,read,writeいくつかのスレッドが生成され、それらの間にソケットペアが生成され、他のスレッドが入出力ファイルを開くことがわかります。

プロセス間の通信に慣れていない場合でも、出力を解析してstrace上記のスレッドのステートメントを確認し、後で何が起こっているのかを確認できますか?私は特にプロセス/スレッド間のデータ転送に興味があります(process1からprocess2に渡されるデータの量はいくらですか?process2は受信したデータをどこに記録しますか?)。

また、ログには次の行が表示されますが、それを正しく解釈する方法がわかりません。

1399  <... close resumed> )             = 0
1400  <... dup2 resumed> )              = 0

ベストアンサー1

  • ファイル記述子引数に関連するパスを印刷する-yフラグを使用することをお勧めします。strace

  • -eはい修飾子ですtrace。必要なシステムコールを見逃すことがあります。

私は条件なしですべてのシステムコールと信号を出力する方が良いと思います。その後、それを使用して必要grepな情報をフィルタリングできます。例は次のとおりです。

grep -E 'dup2\(|clone\(|execve\(|\(open|write|close|openat|F_DUPFD|exit_group' trace.log

おすすめ記事