Apakah ada cara untuk mencegat komunikasi antarproses di Unix / Linux?

15

Untuk memotong / menganalisis lalu lintas jaringan, kami memiliki utilitas bernama Wireshark .

Apakah kita memiliki utilitas serupa untuk mencegat semua komunikasi antar proses antara dua proses di Unix / Linux?

Saya telah membuat beberapa proses dalam memori dan saya perlu membuat profil bagaimana mereka berkomunikasi satu sama lain.

Lazer
sumber
1
Mekanisme IPC apa yang Anda gunakan untuk komunikasi?
axel_c
@ Maxel_c: Sumber proses tidak dengan saya, tapi saya pikir saya membaca "Memori Bersama" di suatu tempat di dokumentasi.
Lazer

Jawaban:

19

Ini sangat tergantung pada mekanisme komunikasi.

  • Pada ujung spektrum yang paling transparan, proses dapat berkomunikasi menggunakan soket internet (yaitu IP ). Kemudian wireshark atau tcpdump dapat menampilkan semua lalu lintas dengan mengarahkannya ke antarmuka loopback.

  • Pada tingkat menengah, lalu lintas pipa dan soket unix dapat diamati dengan truss/ strace/ trace/ ..., gergaji mesin gergaji tentara Swiss. Namun, ini dapat memperlambat proses secara signifikan, sehingga mungkin tidak cocok untuk pembuatan profil.

  • Di ujung spektrum yang paling buram, ada memori bersama. Prinsip operasi dasar memori bersama adalah akses sepenuhnya transparan dalam setiap proses yang terlibat, Anda hanya perlu panggilan sistem untuk mengatur wilayah memori bersama. Menelusuri akses memori ini dari luar akan sulit, terutama jika Anda memerlukan pengamatan untuk tidak mengganggu waktu. Anda dapat mencoba alat-alat seperti Linux trace toolkit (memerlukan tambalan kernel) dan melihat apakah Anda dapat mengekstrak informasi yang berguna; ini adalah jenis tempat di mana saya berharap Solaris memiliki alat yang lebih baik (tapi saya tidak mengetahuinya).

    Jika Anda memiliki sumbernya, opsi terbaik Anda adalah menambahkan pernyataan penelusuran ke fungsi pustaka kunci. Ini mungkin dapat dicapai dengan LD_PRELOADtrik bahkan jika Anda tidak memiliki sumber (keseluruhan), selama Anda memiliki pemahaman yang cukup tentang aliran kontrol dari bagian program yang mengakses memori bersama.

Gilles 'SO- berhenti menjadi jahat'
sumber
6

Ini akan menunjukkan apa yang proses baca dan tulis:

strace -ewrite -p $PID

Ini bukan keluaran bersih (menunjukkan baris seperti: write (#,)), tetapi berfungsi! (dan satu-baris: D) Anda mungkin juga tidak menyukai kenyataan, bahwa argumen disingkat. Untuk mengontrol parameter -s yang mengatur panjang maksimum string yang ditampilkan.

Itu menangkap semua aliran, jadi Anda mungkin ingin menyaringnya entah bagaimana.

Anda dapat memfilternya:

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

hanya menampilkan panggilan deskriptor 1. 2> & 1 adalah untuk mengarahkan ulang stderr ke stdout, seperti strace yang menulis ke stderr secara default.

naugtur
sumber