
我透過以下命令捕獲了輸出:
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
意思是:
1399
是進程的PIDopen(const char *pathname, int flags);
是帶有特定參數的系統呼叫(取自man 2 open
)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
我建議使用
-y
flag forstrace
,它將列印與檔案描述符參數關聯的路徑。-e
是 的限定符trace
,它可能會錯過您想要的系統呼叫。
我認為最好輸出所有系統調用和信號而不進行限定,然後您可以使用它grep
來過濾您想要的信息,示例如下:
grep -E 'dup2\(|clone\(|execve\(|\(open|write|close|openat|F_DUPFD|exit_group' trace.log