我希望能够监控进程发出的某些系统调用,主要是文件I / O调用。在Linux上,我可能会使用带有合适参数的strace,但我怎样才能在Windows上执行此操作?
我主要感兴趣的是运行一个进程并找出它已经读取和写入的文件。
编辑:我想从另一个进程以编程方式执行此操作。我知道ProcessMonitor,但我希望以一种形式接收数据,我可以将其导入另一个程序进行进一步分析。
编辑:如果我进一步缩小我的要求,可能足以监视对CreateFile()的调用。我真的只对打开的文件感兴趣,如果打开它们进行读/写或只是阅读。我没有说明的另一个要求是速度非常重要;我正在计划为编译C ++文件这样做,并且提取一个生成20MB日志文件的完整GUI会产生过高的开销。
编辑:如果它不需要管理权限也会很好。
答案 0 :(得分:25)
Windows上有几个选项。
Windows Performance Toolkit可用于启用各种系统事件的跟踪,包括文件I / O,并包括用于处理和查看这些事件的工具。您可以使用xperf开始跟踪各种类型的事件并保存到ETL文件中,然后可以使用相同的工具处理或查看这些文件。
来自SysInternals的Process Monitor是另一个非常容易使用的选项,它使您能够快速查看系统上正在执行的任何进程的所有文件和注册表访问。 http://blogs.msdn.com/carloc/archive/2008/10/31/how-to-automate-process-monitor.aspx还显示了如何以自动方式运行Process Monitor。
如果您想以编程方式完成此操作,可以使用ETW函数(StartTrace,EnableTrace等)来捕获文件I / O事件并保存到ETL文件。示例代码here。
答案 1 :(得分:5)
在Windows上,您可以使用process monitor来监控进程活动(io和注册表)。如果你真的不想知道系统调用,我想这符合你的需要。
您可以使用winapioverride32监控API呼叫。
答案 2 :(得分:4)
rohitab的API监视器非常适合系统调用
答案 3 :(得分:2)
答案 4 :(得分:2)
另一个Windows API跟踪工具:logexts.dll
(Debugging Tools for Windows的一部分),可以在WinDbg / ntsd / cdb内部运行,也可以通过独立的logger.exe
程序运行。
答案 5 :(得分:2)
另一种方法是使用Deviare API Hook拦截所需的所有用户模式系统调用。使用此框架,您可以为所有调用编写通用处理程序,因为可以使用COM接口读取参数(例如:每个参数是一个INktParam,您可以使用INktParam.Value获取值)。
另一种替代方案,但需要花费一些钱才能使用同一家公司的SpyStudio。该产品有一个命令行选项,可用于收集没有GUI的日志。
答案 6 :(得分:-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 (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