Unix / Linuxでプロセス間通信を傍受する方法はありますか?


15

ネットワークトラフィックを傍受/分析するために、Wiresharkというユーティリティがあります。

Unix / Linuxの2つのプロセス間のすべてのプロセス間通信を傍受するための同様のユーティリティはありますか?

メモリ内にいくつかのプロセスを作成しましたが、それらが相互に通信する方法をプロファイルする必要があります。


1
通信にどのIPCメカニズムを使用していますか?
axel_c

@axel_c:プロセスのソースは私にはありませんが、ドキュメントのどこかで「共有メモリ」を読んだと思います。
レーザー

回答:


19

これは、通信メカニズムに大きく依存します。

  • スペクトルの最も透過的な最後で、プロセスはインターネットソケット(IP)を使用して通信できます。その後、wiresharkまたはtcpdumpは、ループバックインターフェイスを指すことですべてのトラフィックを表示できます。

  • 中間レベルでは、システム追跡のスイス軍チェーンソーである/ / / ...を使用して、パイプUNIXソケットのトラフィックを監視できます。ただし、これによりプロセスが大幅に遅くなる可能性があるため、プロファイリングには適さない場合があります。trussstracetrace

  • スペクトルの最も不透明な端には、共有メモリがあります。共有メモリの基本的な動作原理は、関連する各プロセスでアクセスが完全に透過的であり、共有メモリ領域を設定するためのシステムコールのみが必要であるということです。特にタイミングを乱さないために観測が必要な場合は、これらのメモリアクセスを外部から追跡するのは困難です。Linuxトレースツールキット(カーネルパッチが必要)などのツールを試して、有用な情報を抽出できるかどうかを確認できます。これは、Solarisがより優れたツールを持っていると私が期待するような分野です(しかし、私はそれについて知りません)。

    ソースがある場合、最良のオプションは、主要なライブラリ関数にトレースステートメントを追加することです。これはLD_PRELOAD、共有メモリにアクセスするプログラムの一部の制御フローを十分に理解している限り、(全体の)ソースがなくてもトリックで達成できる場合があります。


6

これにより、プロセスが読み書きする内容が表示されます。

strace -ewrite -p $PID

出力はきれいではありません(write(#、)のような行が表示されます)が、動作します!(そして、単一行:D)また、引数が省略されているという事実を嫌うかもしれません。これを制御するには、表示される文字列の最大長を設定する-sパラメーターを使用します。

すべてのストリームをキャッチするため、何らかの方法でフィルタリングすることをお勧めします。

あなたはそれをフィルタリングすることができます:

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

記述子1呼び出しのみを示します。2>&1は、straceがデフォルトでstderrに書き込むため、stderrをstdoutにリダイレクトします。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.