다음 명령을 사용하여 출력을 캡처했습니다.
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
의미는 다음과 같습니다
1399
프로세스의 PID입니다open(const char *pathname, int flags);
특정 매개변수가 포함된 시스템 호출입니다(man 2 open
다음에서 가져옴).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