답변:
이것은 통신 메커니즘에 많은 영향을받습니다.
스펙트럼의 가장 투명한 끝에서 프로세스는 인터넷 소켓 (예 : IP )을 사용하여 통신 할 수 있습니다 . 그러면 wireshark 또는 tcpdump는 루프백 인터페이스를 가리켜 모든 트래픽을 표시 할 수 있습니다.
중간 수준에서 파이프 및 유닉스 소켓의 트래픽 은 스위스 시스템 추적의 전기 톱인 / truss
/ strace
/ trace
/ ... 로 확인할 수 있습니다 . 그러나 이로 인해 프로세스 속도가 크게 저하 될 수 있으므로 프로파일 링에 적합하지 않을 수 있습니다.
스펙트럼의 가장 불투명 한 끝에는 공유 메모리가 있습니다. 공유 메모리의 기본 작동 원리는 관련된 각 프로세스에서 액세스가 완전히 투명하다는 것입니다. 공유 메모리 영역을 설정하려면 시스템 호출 만 필요합니다. 특히 타이밍을 방해하지 않는 관찰이 필요한 경우 외부에서 이러한 메모리 액세스를 추적하는 것은 어려울 것입니다. Linux 추적 툴킷 (커널 패치 필요)과 같은 도구 를 사용하여 유용한 정보를 추출 할 수 있는지 확인할 수 있습니다. 그것은 솔라리스가 더 나은 툴을 갖기를 기대하는 일종의 영역입니다 (그러나 나는 그것을 알지 못합니다).
소스가있는 경우 가장 좋은 방법은 키 라이브러리 함수에 추적 명령문을 추가하는 것입니다. LD_PRELOAD
공유 메모리에 액세스하는 프로그램 부분의 제어 흐름을 충분히 이해하고 있다면 (전체) 소스가없는 경우에도 트릭 으로 달성 할 수 있습니다 .
프로세스가 읽고 쓰는 것을 보여줍니다.
strace -ewrite -p $PID
깨끗한 출력은 아니지만 (write (#,)와 같은 줄을 보여줍니다) 작동합니다! (및 한 줄 : D) 또한 인수가 생략된다는 사실을 싫어할 수도 있습니다. 표시되는 문자열의 최대 길이를 설정하는 -s 매개 변수를 사용하도록 제어합니다.
모든 스트림을 포착하므로 어떻게 든 필터링 할 수 있습니다.
당신은 그것을 필터링 할 수 있습니다 :
strace -ewrite -p $PID 2>&1 | grep "write(1"
설명자 1 호출 만 표시합니다. 2> & 1은 기본적으로 strace가 stderr에 기록하므로 stderr을 stdout으로 리디렉션하는 것입니다.