strace para solução de problemas de comunicação entre processos

strace para solução de problemas de comunicação entre processos

Eu tenho a saída capturada pelo seguinte comando:

strace -f -e trace=process,socketpair,open,close,dup,dup2,read,write -o rsync.log rsync -avcz --progress src/ dst/

é um pouco longo, então eu carregueiaqui. Entendo o formato básico de stracesaída, por exemplo, a seguinte linha:

1399 open("/lib/x86_64-linux-gnu/libpopt.so.0", O_RDONLY|O_CLOEXEC) = 3

Significa que:

  1. 1399é PID do processo
  2. open(const char *pathname, int flags);é uma chamada de sistema com argumentos específicos (retirados de man 2 open)
  3. 3é o valor de retorno, um descritor de arquivo neste caso específico (retirado de man 2 open)

De acordo comessefio:

rsyncgera dois processos/threads para fazer a cópia, e há um fluxo de dados entre os processos e outro do processo de recebimento para o arquivo de destino.

Usar algo como strace -e trace=process,socketpair,open,read,writemostraria alguns threads gerados, o par de soquetes sendo criado entre eles e diferentes threads abrindo os arquivos de entrada e saída.

Posso de alguma forma analisar stracea saída para poder confirmar as declarações do thread mencionado e ver o que acontece nos bastidores, mesmo que não esteja muito familiarizado com a comunicação entre processos? Estou especialmente interessado na passagem de dados entre processos/threads (quantos dados foram passados ​​do processo1 para o processo2? onde o processo2 gravou os dados recebidos?)

Também vi linhas como esta no log mas não sei como interpretá-las corretamente:

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

Responder1

  • Eu recomendo usar -yflag for strace, ele imprimirá caminhos associados aos argumentos do descritor de arquivo.

  • -eé qualificador para trace, pode ser que você queira perder syscalls.

Acho melhor emitir todas as chamadas e sinais do sistema sem qualificação, então você pode usar greppara filtrar as informações que deseja, exemplo abaixo:

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

informação relacionada