유닉스 / 리눅스에서 프로세스 간 통신을 가로 챌 수있는 방법이 있습니까?


15

네트워크 트래픽을 가로 채거나 분석하기 위해 Wireshark 라는 유틸리티가 있습니다 .

유닉스 / 리눅스에서 두 프로세스 사이의 모든 프로세스 간 통신을 가로채는 비슷한 유틸리티가 있습니까?

메모리에 일부 프로세스를 만들었으며 서로 통신하는 방법을 프로파일 링해야합니다.


1
통신에 어떤 IPC 메커니즘을 사용하고 있습니까?
axel_c

@axel_c : 프로세스 소스가 나와 있지 않지만 설명서의 어딘가에 "공유 메모리"가 있다고 생각합니다.
Lazer

답변:


19

이것은 통신 메커니즘에 많은 영향을받습니다.

  • 스펙트럼의 가장 투명한 끝에서 프로세스는 인터넷 소켓 (예 : IP )을 사용하여 통신 할 수 있습니다 . 그러면 wireshark 또는 tcpdump는 루프백 인터페이스를 가리켜 모든 트래픽을 표시 할 수 있습니다.

  • 중간 수준에서 파이프유닉스 소켓의 트래픽 은 스위스 시스템 추적의 전기 톱인 / truss/ strace/ trace/ ... 로 확인할 수 있습니다 . 그러나 이로 인해 프로세스 속도가 크게 저하 될 수 있으므로 프로파일 링에 적합하지 않을 수 있습니다.

  • 스펙트럼의 가장 불투명 한 끝에는 공유 메모리가 있습니다. 공유 메모리의 기본 작동 원리는 관련된 각 프로세스에서 액세스가 완전히 투명하다는 것입니다. 공유 메모리 영역을 설정하려면 시스템 호출 만 필요합니다. 특히 타이밍을 방해하지 않는 관찰이 필요한 경우 외부에서 이러한 메모리 액세스를 추적하는 것은 어려울 것입니다. Linux 추적 툴킷 (커널 패치 필요)과 같은 도구 를 사용하여 유용한 정보를 추출 할 수 있는지 확인할 수 있습니다. 그것은 솔라리스가 더 나은 툴을 갖기를 기대하는 일종의 영역입니다 (그러나 나는 그것을 알지 못합니다).

    소스가있는 경우 가장 좋은 방법은 키 라이브러리 함수에 추적 명령문을 추가하는 것입니다. LD_PRELOAD공유 메모리에 액세스하는 프로그램 부분의 제어 흐름을 충분히 이해하고 있다면 (전체) 소스가없는 경우에도 트릭 으로 달성 할 수 있습니다 .


6

프로세스가 읽고 쓰는 것을 보여줍니다.

strace -ewrite -p $PID

깨끗한 출력은 아니지만 (write (#,)와 같은 줄을 보여줍니다) 작동합니다! (및 한 줄 : D) 또한 인수가 생략된다는 사실을 싫어할 수도 있습니다. 표시되는 문자열의 최대 길이를 설정하는 -s 매개 변수를 사용하도록 제어합니다.

모든 스트림을 포착하므로 어떻게 든 필터링 할 수 있습니다.

당신은 그것을 필터링 할 수 있습니다 :

strace -ewrite -p $PID 2>&1 | grep "write(1"

설명자 1 호출 만 표시합니다. 2> & 1은 기본적으로 strace가 stderr에 기록하므로 stderr을 stdout으로 리디렉션하는 것입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.