
네트워크 트래픽을 가로채거나 분석하기 위해 다음과 같은 유틸리티가 있습니다.와이어샤크.
Unix/Linux의 두 프로세스 간의 모든 프로세스 간 통신을 가로채는 유사한 유틸리티가 있습니까?
나는 메모리에 몇 가지 프로세스를 만들었고, 이 프로세스들이 서로 어떻게 통신하는지 분석해야 합니다.
답변1
많은 것은 통신 메커니즘에 달려 있습니다.
가장 투명한 끝에서 프로세스는 인터넷 소켓을 사용하여 통신할 수 있습니다(예:지적 재산권). 그런 다음 Wireshark 또는 tcpdump는 루프백 인터페이스를 가리켜 모든 트래픽을 표시할 수 있습니다.
보통 수준에서는 교통관로그리고유닉스 소켓
truss
// / ...를 사용하여 스위스군 전기톱 시스템 추적을strace
관찰할 수 있습니다.trace
그러나 이로 인해 프로세스 속도가 크게 느려지므로 분석에 적합하지 않을 수 있습니다.가장 불투명한 끝에는 공유 메모리가 있습니다. 공유 메모리의 기본 작동 원리는 관련된 각 프로세스 간에 액세스가 완전히 투명하고 공유 메모리 영역을 설정하는 데 시스템 호출만 필요하다는 것입니다. 외부에서 이러한 메모리 액세스를 추적하는 것은 어려울 수 있으며, 특히 타이밍을 방해하지 않고 관찰해야 하는 경우 더욱 그렇습니다. 다음과 같은 도구를 사용해 볼 수 있습니다.Linux 추적 툴킷(커널 패치가 필요함) 유용한 정보를 추출할 수 있는지 확인하십시오. Solaris에 이를 위한 더 나은 도구가 있었으면 좋겠습니다(그러나 나는 그것에 대해 아무것도 모릅니다).
소스 코드가 있는 경우 가장 좋은 옵션은 주요 라이브러리 함수에 추적 문을 추가하는 것입니다.
LD_PRELOAD
이는 공유 메모리에 액세스하는 프로그램 부분의 제어 흐름을 충분히 이해하고 있는 한 (완전한) 소스 코드가 없더라도 트릭을 사용하여 달성할 수 있습니다.
답변2
그러면 프로세스가 읽고 쓰는 내용이 표시됩니다.
strace -ewrite -p $PID
깔끔한 출력은 아니지만(write(#,) 와 같은 줄 표시) 작동합니다! (그리고 그것은 한 줄짜리입니다 :D) 매개변수가 축약된다는 사실이 마음에 들지 않을 수도 있습니다. 이 설정을 제어하려면 -s 매개변수를 사용하여 표시된 문자열의 최대 길이를 설정하십시오.
모든 스트림을 캡처하므로 어떻게든 필터링해야 할 수도 있습니다.
다음과 같이 필터링할 수 있습니다.
strace -ewrite -p $PID 2>&1 | grep "write(1"
설명자 1 호출만 표시됩니다. 2>&1은 strace가 기본적으로 stderr에 쓰기 때문에 stderr을 stdout으로 리디렉션합니다.