プロセス間通信のログ ファイルを作成しようとした人はいますか? これを達成するための最善の方法について、誰かが私に少しアドバイスをくれますか?
3 に答える
質問はあまり明確ではなく、コメントはあまり明確ではありませんが、とにかく...
最初に試すべき 2 つのことは、ipcsとstrace -e trace=ipcです。
カーネル ドライバーへの通信には、さまざまな形式があります。通常、通信用の特別なデバイス ファイルが存在するか、NETLINK などの特別なソケット タイプが存在する場合があります。運が良ければ、read() と write() が対話の唯一の手段であるキャラクター デバイスがあります。その場合、これらの呼び出しはさまざまな方法で簡単に傍受できます。運が悪いと、多くのことが ioctl やさらに難しいことで行われます。
ただし、カーネル ドライバーを使用して通信するプログラムで「strace」を実行すると、プログラムが通信に使用するライブラリがたまたまある場合は「ltrace」の方が読みやすいかもしれませんが、それが行うことのほぼすべてを明らかにすることができます。引数を「strace」に調整することで、必要な情報だけを含むダンプを取得できる可能性があります。
- まず、呼び出しを観察して、カーネル通信の手段を見つけようとします。
- 次に、フィルターを strace 呼び出しに追加して、カーネル通信呼び出しのみをログに記録します
- 最後に、strace がすべての呼び出しの完全な文字列をログに記録するようにします。これにより、切り捨てられたデータを処理する必要がなくなります。
カーネルとの通信が IPC とはほとんど関係がないため、IPC デバッグを指す回答はおそらく関係ありません (少なくとも、異なる UNIX IPC 機能は関係ありません)。
すべての IPC をログに記録したい場合 (非常に負荷がかかるようです)、インストルメンテーションを検討する必要があります。
これには多くの優れたツールがあります。特に、マニュアルのこのセクションのPINを確認してください。
この例では、命令を調べることによって、より選択的なインストルメンテーションを行う方法を示します。このツールは、プログラムによって参照されるすべてのメモリ アドレスのトレースを生成します。これは、プロセッサ内のデータ キャッシュのデバッグやシミュレーションにも役立ちます。
重いチューニングと分析を行っている場合は、TAU (Tuning and analysis utilitiy) を確認してください。