Windows プロセスの I/O を監視するオーバーヘッドの少ない方法が必要です。
Windows のプロセスによって実行される特定のシステム コールを監視することについて、いくつかの役立つ回答を得ました。最も有望なのは、Windows Performance Toolkit を使用してカーネル イベント トレースを取得することでした。必要なすべての情報は実際にそこから引き出すことができますが、WPT は私が必要とするものに対して非常に過剰であり、その後法外なオーバーヘッドが生じます。
私のアイデアは、C/C++ 依存関係グラフを検出する別のアプローチを実装することでした。通常、これはオプション (-M など) をコンパイラに渡すことによって行われます。これは、そのようなオプションを持つコンパイラとツールでは問題なく機能しますが、すべてが機能するわけではなく、それらを異なる方法で実装することがよくあります。そのため、どのファイルが開かれているかを検出するために strace を使用して Linux でこれを行う別の方法を実装しました。この方法で (たとえば) gcc を実行すると、50% のオーバーヘッド (概算図) が発生します。同様のオーバーヘッドを持つ Windows でこれを行う方法を見つけたいと思っていました。
ツールの xperf セットには 2 つの問題があり、この場合は使用できません。
- 単一プロセスのファイル I/O イベントを監視する方法はありません。すべてのプロセスをトレースするカーネル イベント トレースを使用する必要があるため、膨大な量のデータが生成されます (gcc、YMMV の実行にかかる時間は 15Mb)。
- カーネル イベント トレースを使用する必要があるため、管理者として実行する必要があります。
カーネル レベルでのイベントは本当に必要ありません。たとえば、Win32 API 呼び出しの CreateFile() を監視できれば、同様に管理できると思います。また、フォークされたプロセスをキャッチしたい場合は、CreateProcess() を呼び出すこともできます。
何か賢いアイデアはありますか?