代码之家  ›  专栏  ›  技术社区  ›  JesperE

监视由Windows中的进程完成的某些系统调用

  •  34
  • JesperE  · 技术社区  · 16 年前

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

    我主要是想运行一个进程,并找出它读写过哪些文件。

    编辑:我想从另一个进程以编程方式完成这项工作。我知道processmonitor,但我想以一种形式接收数据,我可以将其导入另一个程序进行进一步分析。

    编辑:如果我进一步缩小我的需求范围,可能就足够监视对createfile()的调用了。我真的只对打开哪些文件感兴趣,如果这些文件是以读/写方式打开的,或者只是以读方式打开的。另一个我没有说的要求是 速度 是相当重要的,我正计划这样做的事情,如编译一个C++文件,拉一个完整的GUI,产生20MB的日志文件将有高昂的开销。

    编辑:如果它不需要管理特权也会很好。

    7 回复  |  直到 11 年前
        1
  •  25
  •   Michael    16 年前

    Windows上有几个选项。

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

    Process Monitor From SysInternals是另一个非常易于使用的选项,它使您能够快速看到系统上任何进程正在进行的所有文件和注册表访问。 http://blogs.msdn.com/carloc/archive/2008/10/31/how-to-automate-process-monitor.aspx 还演示了如何以自动化方式运行流程监视器。

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

        2
  •  5
  •   kcwu    16 年前

    在Windows上,您可以使用 process monitor 监视进程活动(IO和注册表)。如果你不想知道系统调用,我想这符合你的需要。

    你可以使用 winapioverride32 监控API调用。

        3
  •  4
  •   ds-bos-msk    11 年前

    Rohitab的API监视器非常适合系统调用

    http://www.rohitab.com/apimonitor

        4
  •  2
  •   anon    16 年前

    也许吧 FileMon ?

    也有 NtTrace 类似于Strace。

        5
  •  2
  •   bk1e    16 年前

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

        6
  •  2
  •   Pablo Yabo    11 年前

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

    另一种选择是使用 SpyStudio 来自同一家公司。此产品有一个命令行选项,用于收集不带GUI的日志。

        7
  •  -5
  •   Matt Joiner    14 年前

    怎么没人提到 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 (flags FD_CLOEXEC)
    getdents64(3, /* 18 entries */, 4096)   = 496
    getdents64(3, /* 0 entries */, 4096)    = 0
    close(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