Windows上的低开销I / O监控

时间:2009-05-19 16:55:39

标签: winapi process trace

我想要一种监控Windows进程I / O的低开销方法。

我得到了Monitoring certain system calls done by a process in Windows的几个有用的答案。最有希望的是使用Windows Performance Toolkit来获取内核事件跟踪。确实可以从那里获取所有必要的信息,但是WPT对于我所需要的东西来说是一次大规模的过度杀伤,并且随后会产生过高的开销。

我的想法是实现一种检测C / C ++依赖图的替代方法。通常,这是通过将选项传递给编译器(例如,-M)来完成的。这适用于具有这种选项的编译器和工具,但并非所有这些选项都可以,并且那些经常以不同方式实现它们的人。因此,我在Linux上使用strace来实现另一种方法,以检测打开的文件。以这种方式运行gcc(例如)有50%的开销(球场数字),我希望找到一种方法来在具有类似开销的窗口上执行此操作。

xperf工具集有两个问题阻止我在这种情况下使用它们:

  • 无法监控单个进程的文件I / O事件;我必须使用跟踪每个进程的内核事件跟踪,从而生成大量数据(运行gcc,YMMV所需的时间为15Mb)。
  • 由于必须使用内核事件跟踪,我必须以管理员身份运行。

我真的不需要内核级别的事件;我想我可以管理,如果我可以监视,例如,Win32 API调用CreateFile(),如果我想捕获分叉进程,可能还有CreateProcess()。

任何聪明的想法?

3 个答案:

答案 0 :(得分:3)

使用API​​挂钩。挂钩NtCreateFile和ntdll中的一些其他调用就足够了。我有很好的经验使用easyhook作为一个框架来自己挂钩 - 免费和开源。如果你想这样做,甚至支持托管挂钩(c#等)。这很容易设置。

位于http://easyhook.codeplex.com

编辑:btw绕道不允许64位挂钩(除非您以10,000USD的名义价格购买许可证) EasyHook不允许跨越WOW64边界的本机挂钩。它允许跨越WOW64边界进行托管挂钩。

答案 1 :(得分:0)

我过去使用Microsoft的Detours来拦截特定的API调用来跟踪内存分配。您可以使用它来跟踪CreateFile和CreateProcess。

答案 2 :(得分:0)

似乎Dr. Memory's System Call Tracer for Windows正是我想要的。它基本上是Windows的strace实现。