3

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

我得到了几个有用的答案来监控 Windows 中的进程完成的某些系统调用。最有希望的是使用 Windows Performance Toolkit 来获取内核事件跟踪。确实可以从那里提取所有必要的信息,但是 WPT 对于我需要的东西来说是一个巨大的过度杀伤力,因此会产生令人望而却步的开销。

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

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

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

我真的不需要内核级别的事件;我想如果我可以监控 Win32 API 调用 CreateFile(),如果我想捕获分叉进程,我可能会管理得一样好。

有什么聪明的主意吗?

4

3 回答 3

3

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

它位于http://easyhook.codeplex.com

编辑:顺便说一句,弯路不允许 64 位挂钩(除非您以 10,000 美元的名义价格购买许可证)EasyHook 不允许跨 WOW64 边界的本地挂钩。不过,它允许跨 WOW64 边界进行托管挂钩。

于 2009-05-19T17:05:46.273 回答
0

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

于 2009-05-19T17:05:36.773 回答
0

似乎Dr. Memory 的 Windows 系统调用跟踪器正是我想要的。它基本上是straceWindows 的实现。

于 2014-04-03T16:02:35.403 回答