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

관련 정보