2010-07-12 6 views
0

일반적으로 네트워크 I/O 디버깅에는 tcpflow을 사용하지만 프로세스별로 필터링 할 수있는 방법이없는 것 같습니다. 따라서 수동으로 어떤 파일이 필요하다고 판단해야합니까? 프로그램이 디버깅 중이고 완전히 관련없는 트래픽입니다. 일반적으로 둘 다 대부분 http이므로 포트 필터링은 문제가되지 않으며 원격 호스트 이름으로 필터링하는 것은 때때로 가능합니다.프로그램의 모든 네트워크 입출력 저장

이론 상으로는 효과가 있습니다. 프로세스 ID는 소켓과 연관 될 수 있습니다. 최소한 /proc/net/tcp은 소켓 주소 쌍을 inodes와 연결하고 fstat/proc/*/fd/*은 모든 소켓 inode를 프로세스로 표시합니다 (즉, netstat -p이 사용합니다). 그러나 트래픽 캡처 프로그램에서 실시간으로 처리해야합니다 그렇지 않으면이 데이터는 모두 사라집니다. 그래서 나중에 올바른 파일을 grep 할 수 없습니다. (otoh 이것이 OSX에서도 가능할 지 모르겠다.)

또 다른 가능성은 외부 모니터 대신 프로그램이 시작될 때 LD_PRELOAD과 같은 일종의 저수준 라이브러리 주입을 사용하는 것입니다.

프로그램에서 모든 단일 네트워크 읽기 및 쓰기를 찾는 대안과 로깅 코드를 추가하는 것은 고려하기에 너무 무서운 것입니다. 특히 실제 I/O는 많은 경우 제 3 자 라이브러리에 깊숙이 묻혀 있기 때문에 특히 그렇습니다.

어떤 권장 사항이 있습니까? 크로스 플랫폼이 완벽 할 수는 있지만, OSX 또는 Linux에서 작동한다면 충분합니다.

+0

해킹이지만 strace를 사용하면 일부 범위를 좁힐 수 있습니다. 로컬 및 네트워크 모두의 모든 읽기 및 쓰기를 볼 수 있습니다. – qdot

답변

1

특정 사용자 ID에서 프로그램을 실행하는 경우 대부분의 주요 방화벽 (Linux에서 사용되는 netfilter/iptables 이상)을 사용하여 사용자별로 트래픽을 표시 한 다음 Wireshark를 사용하여 해당 트래픽을 저장할 수 있습니다. 그냥 디버그 네트워크 데이터를 원하는 경우

또한, 사용해보십시오 : 멀티 플랫폼 요구 사항에 대한

strace -f -e trace=network -s 10000 ping 8.8.8.8 

죄송가되지

을 충족합니다. Windows에서 다른 프로그램의 낮은 수준의 네트워크 I/O 처리는 나에게 조금 까다로운 것처럼 보입니다.