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вывод, чтобы иметь возможность подтвердить утверждения из упомянутого потока и увидеть, что происходит под капотом, даже если я не очень хорошо знаком с межпроцессным взаимодействием? Меня особенно интересует передача данных между процессами/потоками (сколько данных было передано от процесса 1 к процессу 2? куда процесс 2 записал полученные данные?)

Я также видел в журнале такие строки, но не знаю, как их правильно интерпретировать:

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

решение1

  • Я рекомендую использовать -yфлаг for strace, он выведет пути, связанные с аргументами дескриптора файла.

  • -eявляется квалификатором для trace, возможно, вам нужны пропущенные системные вызовы.

Я думаю, что лучше выводить все системные вызовы и сигналы без квалификации, а затем можно использовать их grepдля фильтрации нужной информации, пример ниже:

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

Связанный контент