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

相关内容