【问题标题】:Monitoring certain system calls done by a process in Windows监视由 Windows 中的进程完成的某些系统调用
【发布时间】:2010-10-26 06:38:07
【问题描述】:

我希望能够监控某个进程进行的某些系统调用,主要是文件 I/O 调用。在 Linux 上,我可能可以使用带有合适参数的strace,但如何在 Windows 上做到这一点?

我主要对运行一个进程并找出它已读取和写入的文件感兴趣。

我想从另一个进程以编程方式执行此操作。我知道Process Monitor,但我想以可以导入另一个程序进行进一步分析的形式接收数据。

如果我进一步缩小我的要求,那么能够监控对 CreateFile() 的调用可能就足够了。我真的只对打开哪些文件感兴趣,以及它们是打开读/写还是只是读。我没有真正说明的另一个要求是 速度 相当重要。我打算这样做是为了编译一个 C++ 文件,然后提取一个生成 20 MB 日志文件的完整 GUI,这会产生令人望而却步的开销。

如果它不需要管理权限也很好。

【问题讨论】:

  • 有趣。 Windows 中没有类似于 linux ptrace syscall 的东西吗?所有的答案都是关于使用其他程序,但使用 ptrace() 之类的程序你可以自己做。
  • 如果您对不同的方法感兴趣,我询问了一个相当于 ptrace 的窗口:stackoverflow.com/questions/865106/…

标签: windows process cross-platform


【解决方案1】:

在 Windows 上有几个选项。

Windows Performance Toolkit 可用于启用各种系统事件的跟踪,包括文件 I/O,并包括用于处理和查看这些事件的工具。您可以使用 xperf 开始跟踪各种类别的事件并将其保存到 ETL 文件中,然后您可以稍后使用相同的工具进行处理或查看。

Process Monitor from Sysinternals 是另一个非常易于使用的选项,它使您能够快速查看系统上任何进程正在执行的所有文件和注册表访问。你也可以run Process Monitor in an automated fashion。

如果您想完全以编程方式执行此操作,您可以使用 ETW 函数(StartTrace、EnableTrace 等)捕捉文件 I/O 事件并保存到 ETL 文件。示例代码here。

【讨论】:

  • 谢谢,我会研究 WPT。 ProcessMonitor 是否支持在没有 GUI 的情况下运行?
  • 更新了答案,其中包含显示如何自动化进程监视器的链接。
  • 有没有办法在不下载高达 1.3GB (!) iso-image 的情况下获得 xperf 工具集?
  • ProcessMonitor 的命令行使用有点短:它仍然打开一个窗口,我找不到在命令行上指定过滤器的方法。此外,ProcessMonitor 已经以管理员身份运行(至少在我的 Vista 机器上),这使得它无法用于我的目的。
  • msdn.microsoft.com/en-us/performance/default.aspx,在下载下,仅下载了几个不到 5 MB 的工具包。
【解决方案2】:

在 Windows 上,您可以使用 Process Monitor 来监控进程活动(I/O 和注册表)。如果您真的不想知道系统调用,我想这符合您的需要。

您可以使用winapioverride32 来监控 API 调用。

【讨论】:

  • 如何修改特定系统调用使用的参数?
【解决方案3】:

使用FileMon(现已集成到Process Monitor)。

还有NtTrace,类似于strace。

【讨论】:

  • NtTrace 在我的 Vista x64 上失败,出现大量“无法捕获...错误签名”。不过,它自 2007 年以来就没有更新过。
【解决方案4】:

另一个 Windows API 跟踪工具:logexts.dll(Debugging Tools for Windows 的一部分),可以从 WinDbg/ntsd/cdb 内部或通过独立的 logger.exe 程序运行。

【讨论】:

    【解决方案5】:

    使用strace。示例输出:

    open(".", O_RDONLY|O_NONBLOCK|O_LARGEFILE|O_DIRECTORY|O_CLOEXEC) = 3
    fstat64(3, {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
    fcntl64(3, F_GETFD) = 0x1(标志 FD_CLOEXEC)
    getdents64(3, /* 18 个条目 */, 4096) = 496
    getdents64(3, /* 0 个条目 */, 4096) = 0
    关闭(3)= 0
    fstat64(1, {st_mode=S_IFIFO|0600, st_size=0, ...}) = 0
    mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7f2c000
    write(1, "autofs\nbackups\ncache\nflexlm\ngames"..., 86autofsA

    【讨论】:

    • @matt 反正有strace in cygwin。
    • @Matt 预计答案适用于 Windows。 strace 主要是一个 Linux 实用程序。
    【解决方案6】:

    另一种方法是使用Deviare API Hook 并拦截您想要的所有用户模式系统调用。使用此框架,您可以为所有调用编写通用处理程序,因为可以使用 COM 接口读取参数(例如,每个参数都是一个 INktParam,您可以使用 INktParam.Value 获取值)。

    另一种选择是使用同一家公司的SpyStudio,但这会花费一些钱。该产品有一个命令行选项,可用于在没有 GUI 的情况下收集日志。

    【讨论】:

      【解决方案7】:

      Rohitab Batra 的API Monitor 非常适合系统调用。

      【讨论】:

        猜你喜欢
        • 2012-10-31
        • 1970-01-01
        • 1970-01-01
        • 2019-08-29
        • 1970-01-01
        • 2010-11-03
        • 1970-01-01
        • 1970-01-01
        • 2018-07-14
        相关资源
        最近更新 更多