我想要一种监控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工具集有两个问题阻止我在这种情况下使用它们:
我真的不需要内核级别的事件;我想我可以管理,如果我可以监视,例如,Win32 API调用CreateFile(),如果我想捕获分叉进程,可能还有CreateProcess()。
任何聪明的想法?
答案 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
实现。