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ą.


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.


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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.