프로세스 간 통신 문제 해결을 위한 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

  • -y에 플래그를 사용하는 것이 좋습니다 strace. 그러면 파일 설명자 인수와 관련된 경로가 인쇄됩니다.

  • -e에 대한 한정자입니다 trace. 원하는 시스템 호출이 누락될 수 있습니다.

grep나는 자격을 갖추지 않고 모든 시스템 호출과 신호를 출력하는 것이 더 낫다고 생각합니다. 그런 다음 아래 예와 같이 원하는 정보를 필터링하는 데 사용할 수 있습니다 .

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

관련 정보