【问题标题】:Low-overhead I/O monitoring on WindowsWindows 上的低开销 I/O 监控
【发布时间】:2009-05-19 16:55:38
【问题描述】:

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

我得到了几个对Monitoring certain system calls done by a process in Windows 有用的答案。最有希望的是使用 Windows Performance Toolkit 来获取内核事件跟踪。确实可以从那里提取所有必要的信息,但是 WPT 对我需要的东西来说是一个巨大的过度杀伤力,因此会产生令人望而却步的开销。

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

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

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

我真的不需要内核级别的事件;我想如果我可以监控 Win32 API 调用 CreateFile() 以及如果我想捕获分叉的进程,可能还可以监控 CreateProcess(),我也可以做到。

有什么聪明的想法吗?

【问题讨论】:

    标签: winapi process trace


    【解决方案1】:

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

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

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

    【讨论】:

    • 这似乎正是我想要的。谢谢!
    • 那么使用 EasyHook,在 64 位系统上挂钩 NTCreateFile 没有意义吗?
    【解决方案2】:

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

    【讨论】:

    • 另外,我自己也没用过,但是EasyHook (easyhook.codeplex.com) 经常被称为比Detours 好。
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-06-02
      • 2012-08-20
      • 1970-01-01
      • 1970-01-01
      • 2013-09-18
      • 1970-01-01
      相关资源
      最近更新 更多