Есть ли способ перехватить межпроцессное взаимодействие в Unix / Linux?

15

Для перехвата / анализа сетевого трафика у нас есть утилита Wireshark .

Есть ли у нас похожая утилита для перехвата всех межпроцессных взаимодействий между любыми двумя процессами в Unix / Linux?

Я создал несколько процессов в памяти, и мне нужно профилировать, как они общаются друг с другом.

Lazer
источник
1
Какой механизм (ы) IPC вы используете для общения?
axel_c
@axel_c: источник процесса не со мной, но я думаю, что я прочитал «Общая память» где-то в документации.
Лазер

Ответы:

19

Это во многом зависит от механизма общения.

  • На самом прозрачном конце спектра процессы могут взаимодействовать с использованием интернет-сокетов (то есть IP ). Затем wireshark или tcpdump могут показывать весь трафик, указывая его на интерфейс обратной связи.

  • На промежуточном уровне можно наблюдать трафик на трубопроводах и гнездах Unix с помощью truss/ strace/ trace/ ..., швейцарской армейской бензопилой системы отслеживания. Однако это может значительно замедлить процессы, поэтому может не подойти для профилирования.

  • На самом непрозрачном конце спектра находится общая память. Основной принцип работы разделяемой памяти заключается в том, что доступы абсолютно прозрачны в каждом вовлеченном процессе, вам нужны только системные вызовы для настройки областей разделяемой памяти. Отслеживать эти обращения к памяти извне было бы сложно, особенно если вам нужно наблюдение, чтобы не нарушить время. Вы можете попробовать такие инструменты, как инструментарий трассировки Linux (требуется патч для ядра) и посмотреть, сможете ли вы извлечь полезную информацию; это та область, где я ожидаю, что у Solaris будет лучший инструмент (но я об этом ничего не знаю).

    Если у вас есть источник, лучшим вариантом может быть добавление операторов трассировки в ключевые библиотечные функции. Это может быть достигнуто с помощью LD_PRELOADхитростей, даже если у вас нет (целого) источника, если у вас достаточно понимания потока управления той части программы, которая обращается к общей памяти.

Жиль "ТАК - прекрати быть злым"
источник
6

Это покажет, что процесс читает и пишет:

strace -ewrite -p $PID

Это не чистый вывод (показывает такие строки, как: write (#,)), но работает! (и однострочный: D) Вам также может не понравиться тот факт, что аргументы сокращены. Для управления этим используйте параметр -s, который устанавливает максимальную длину отображаемых строк.

Он перехватывает все потоки, так что вы можете захотеть отфильтровать это.

Вы можете отфильтровать это:

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

показывает только дескриптор 1 вызовов. 2> & 1 - перенаправить stderr в stdout, так как strace записывает в stderr по умолчанию.

naugtur
источник