Czy istnieje sposób na przechwycenie komunikacji międzyprocesowej w systemach Unix / Linux?

15

Do przechwytywania / analizy ruchu sieciowego mamy narzędzie o nazwie Wireshark .

Czy mamy podobne narzędzie do przechwytywania całej komunikacji międzyprocesowej między dowolnymi dwoma procesami w systemach Unix / Linux?

Utworzyłem niektóre procesy w pamięci i muszę określić, w jaki sposób komunikują się ze sobą.

Lazer
źródło
1
Jakich mechanizmów IPC używasz do komunikacji?
axel_c
@axel_c: Źródło procesu nie jest ze mną, ale myślę, że gdzieś w dokumentacji przeczytałem „Shared Memory”.
Lazer,

Odpowiedzi:

19

Zależy to w dużej mierze od mechanizmu komunikacji.

  • Na najbardziej przejrzystym końcu spektrum procesy mogą komunikować się za pomocą gniazd internetowych (tj. IP ). Następnie wireshark lub tcpdump może pokazać cały ruch, wskazując go na interfejs pętli zwrotnej.

  • Na poziomie pośrednim ruch na rurach i gniazdach unixowych można obserwować za pomocą truss/ strace/ trace/ ..., szwajcarskiej piły łańcuchowej śledzenia systemu. Może to jednak znacznie spowolnić procesy, więc może nie nadawać się do profilowania.

  • Na najbardziej nieprzezroczystym końcu spektrum znajduje się pamięć współdzielona. Podstawowa zasada działania pamięci współużytkowanej polega na tym, że dostęp jest całkowicie przejrzysty w każdym zaangażowanym procesie, do skonfigurowania regionów pamięci współużytkowanej potrzebne są tylko wywołania systemowe. Śledzenie dostępu do pamięci z zewnątrz byłoby trudne, szczególnie jeśli potrzebujesz obserwacji, aby nie zakłócać pomiaru czasu. Możesz wypróbować narzędzia takie jak Linux trace toolkit (wymaga poprawki jądra) i sprawdzić, czy możesz wyodrębnić przydatne informacje; jest to obszar, w którym spodziewałbym się, że Solaris będzie miał lepsze narzędzie (ale nie mam o nim wiedzy).

    Jeśli masz źródło, najlepszą opcją może być dodanie instrukcji śledzenia do kluczowych funkcji biblioteki. Można to osiągnąć za pomocą LD_PRELOADlew, nawet jeśli nie masz (całego) źródła, o ile masz wystarczającą wiedzę na temat przepływu sterowania w części programu, która uzyskuje dostęp do pamięci współdzielonej.

Gilles „SO- przestań być zły”
źródło
6

To pokaże, co proces czyta i zapisuje:

strace -ewrite -p $PID

Nie jest to czysty wynik (pokazuje wiersze takie jak: write (#,)), ale działa! (i jest jednowierszowy: D) Możesz także nie lubić faktu, że argumenty są skrócone. Aby kontrolować ten parametr -s, który ustawia maksymalną długość wyświetlanych ciągów.

Łapie wszystkie strumienie, więc możesz to jakoś przefiltrować.

Możesz to przefiltrować:

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

pokazuje tylko wywołania deskryptora 1. 2> & 1 to przekierowanie stderr na stdout, ponieważ strace domyślnie zapisuje do stderr.

naugtur
źródło