プロセス間通信のトラブルシューティングのための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? 特に、プロセス/スレッド間のデータの受け渡しに興味があります (プロセス 1 からプロセス 2 に渡されたデータの量はどれくらいですか? プロセス 2 は受信したデータをどこに書き込みましたか?)

ログに次のような行も見たことがありますが、正しく解釈する方法がわかりません。

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

関連情報