我希望能够监视某个进程所做的某些系统调用,主要是文件I / O调用。 在Linux上,我可能会用适当的参数使用strace,但是我怎么能在Windows上做到这一点?
我主要感兴趣的是运行一个进程,并找出它已经读取和写入的文件。
编辑:我想从另一个进程编程。 我知道ProcessMonitor,但我想以一种可导入另一个程序的forms接收数据以供进一步分析。
编辑:如果我进一步缩小我的要求,它可能足以能够监视CreateFile()的调用。 我真的只关心打开哪些文件,如果打开它们来读/写或者只读。 另一个我没有真正说明的要求是速度是相当重要的, 我打算做这样的事情,如编译一个C ++文件,并拉起一个完整的graphics用户界面,生成一个20MB的日志文件将有非常高的开销。
编辑:这也不错,如果它不需要pipe理权限。
Windows上有几个选项。
Windows Performance Toolkit可用于启用对各种系统事件(包括文件I / O)的跟踪,并包含用于处理和查看这些事件的工具。 您可以使用xperf开始跟踪不同类别的事件,并将其保存到ETL文件中,以后可以使用相同的工具进行处理或查看。
来自SysInternals的进程监视器是另一个非常容易使用的选项,使您能够快速查看系统上正在进行的所有文件和注册表访问。 http://blogs.msdn.com/carloc/archive/2008/10/31/how-to-automate-process-monitor.aspx也展示了如何以自动化的方式运行Process Monitor。
如果您希望完全以编程方式执行此操作,则可以使用ETW函数(StartTrace,EnableTrace等)来捕捉文件I / O事件并保存到ETL文件中。 示例代码在这里 。
在Windows上,您可以使用进程监视器来监视进程活动(io和注册表)。 我想这是适合你的需要,如果你不是真的想知道系统调用。
你可以使用winapioverride32来监控api调用。
通过rohitab进行API监视非常适合系统调用
也许FileMon ?
还有NtTrace ,类似于strace。
另一个Windows API跟踪工具: logexts.dll
( Windows调试工具的一部分),可以从WinDbg / ntsd / logger.exe
或通过独立的logger.exe
程序运行。
另一种方法是使用Deviare API Hook拦截所需的所有用户模式系统调用。 使用这个框架,你可以为所有的调用编写一个通用的处理程序,因为可以使用COM接口读取参数(例如:每个参数都是一个INktParam,你可以使用INktParam.Value获取值)。
另一个选择,但它会花费一些钱是从同一家公司使用SpyStudio 。 该产品有一个命令行选项,可用于在没有GUI的情况下收集日志。
没有人提起strace
? 示例输出:
打开(“。”,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 entries * /,4096)= 496 getdents64(3,/ * 0 entries * /,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 写(1,“autofs \ nbackups \ ncache \ nflexlm \ ngames”,86autofsA