Чи існує спосіб перехоплення міжпроцесорної комунікації в Unix / Linux?


15

Для перехоплення / аналізу мережевого трафіку у нас є утиліта під назвою Wireshark .

Чи є у нас аналогічна утиліта для перехоплення всіх міжпроцесорних комунікацій між будь-якими двома процесами в Unix / Linux?

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


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 за замовчуванням.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.