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產生兩個進程/執行緒來進行複製,進程之間有一個流數據,另一個從接收進程到目標檔案。

使用類似的東西strace -e trace=process,socketpair,open,read,write會顯示一些執行緒產生,在它們之間建立套接字對,以及開啟輸入和輸出檔案的不同執行緒。

即使我不太熟悉進程間通信,我是否可以以某種方式解析strace輸出以確認提到的線程中的語句並查看幕後發生的情況?我對進程/執行緒之間的資料傳遞特別感興趣(從process1到process2傳遞了多少資料?process2將接收到的資料寫入哪裡?)

我也在日誌中看到了這樣的行,但我不知道如何正確解釋它們:

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

答案1

  • 我建議使用-yflag for strace,它將列印與檔案描述符參數關聯的路徑。

  • -e是 的限定符trace,它可能會錯過您想要的系統呼叫。

我認為最好輸出所有系統調用和信號而不進行限定,然後您可以使用它grep來過濾您想要的信息,示例如下:

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

相關內容