Existe-t-il un moyen d'intercepter les communications interprocessus sous Unix / Linux?


15

Pour intercepter / analyser le trafic réseau, nous avons un utilitaire appelé Wireshark .

Avons-nous un utilitaire similaire pour intercepter toutes les communications interprocessus entre deux processus sous Unix / Linux?

J'ai créé certains processus en mémoire et j'ai besoin de profiler la façon dont ils communiquent entre eux.


1
Quel (s) mécanisme (s) IPC utilisez-vous pour la communication?
axel_c

@axel_c: La source du processus n'est pas avec moi, mais je pense que j'ai lu "Mémoire partagée" quelque part dans la documentation.
Lazer

Réponses:


19

Cela dépend beaucoup du mécanisme de communication.

  • À l'extrémité la plus transparente du spectre, les processus peuvent communiquer à l'aide de sockets Internet (c'est-à-dire IP ). Ensuite, wireShark ou tcpdump peut afficher tout le trafic en le pointant vers l'interface de bouclage.

  • À un niveau intermédiaire, le trafic sur les tuyaux et les prises Unix peut être observé avec truss/ strace/ trace/ ..., la tronçonneuse de l'armée suisse de traçage du système. Cependant, cela peut ralentir considérablement les processus, ce qui peut ne pas convenir au profilage.

  • À l'extrémité la plus opaque du spectre, il y a la mémoire partagée. Le principe de fonctionnement de base de la mémoire partagée est que les accès sont complètement transparents dans chaque processus impliqué, vous n'avez besoin que d'appels système pour configurer des régions de mémoire partagée. Le traçage de ces accès mémoire de l'extérieur serait difficile, surtout si vous avez besoin de l'observation pour ne pas perturber le timing. Vous pouvez essayer des outils comme le kit d'outils de trace Linux (nécessite un correctif du noyau) et voir si vous pouvez extraire des informations utiles; c'est le genre de domaine où je m'attendrais à ce que Solaris ait un meilleur outil (mais je n'en ai aucune connaissance).

    Si vous avez la source, votre meilleure option pourrait bien être d'ajouter des instructions de suivi aux fonctions clés de la bibliothèque. Cela peut être réalisable avec des LD_PRELOADastuces même si vous n'avez pas la source (entière), tant que vous avez suffisamment de compréhension du flux de contrôle de la partie du programme qui accède à la mémoire partagée.


6

Cela montrera ce qu'un processus lit et écrit:

strace -ewrite -p $PID

Ce n'est pas une sortie propre (affiche des lignes comme: écrire (#,)), mais fonctionne! (et est une seule ligne: D) Vous pourriez également détester le fait que les arguments soient abrégés. Pour contrôler ce paramètre, utilisez -s qui définit la longueur maximale des chaînes affichées.

Il intercepte tous les flux, donc vous voudrez peut-être filtrer cela d'une manière ou d'une autre.

Vous pouvez le filtrer:

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

affiche uniquement les appels du descripteur 1. 2> & 1 consiste à rediriger stderr vers stdout, comme strace écrit par défaut sur stderr.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.