该程序打开了哪些文件(在Windows上)?

时间:2014-05-06 23:34:15

标签: windows build hook system-calls tracing

我正在设计一个小型实用程序来帮助构建系统。我们的想法是该实用程序将启动每个编译器的每个实例,并输出编译期间编译器打开的所有文件的日志。类似的东西:

track-files cc -c -o foo.o foo.c

然后track-files执行cc并输出.h打开的所有cc(和其他)文件。但cc可能是任何编译器(甚至是解释器或只是进行某种文本转换的程序)。

Paul D Smith's Advanced Auto-Dependency tutorial中描述了一个类似的想法,并归功于Han-Wen Nienhuys。

在Linux,FreeBSD,Solaris和HPUX上我想我可以使用LD_PRELOAD。在AIX上我可以使用LDR_PRELOAD,在OSX上我可以使用DYLD_INSERT_LIBRARIES。在大多数系统中,如果strace,我也可以使用LD_PRELOAD - 这样的技巧不起作用。

我不知道如何继续操作的操作系统是Windows。我一直在环顾四周,到目前为止我发现的一切似乎......,令人不满意。

LD_PRELOAD equivalent for Windows to preload shared libraries的唯一答案表明AppInit_DLLs,但指出它们在Vista之后被弃用和/或禁用(因为它们已被破坏)。

interposers on Windows上接受的答案指向Microsoft Research的{​​{3}},但这是专有的(他们为64位支持收取大笔费用(USD10000 !!!))这样会使我的实用程序毫无价值几乎每个人(包括我)。另一个答案提到了一个名为WinAPI Override的东西,但这显然只是32位。

肯定有一些可靠的,非专有的,编程方式在Windows上执行此操作。有些跟踪API也许?我很高兴只支持更新版本的Windows(例如Windows 7和8)。

2 个答案:

答案 0 :(得分:1)

没有找到任何免费&解决这个问题的好方法我已经编写了自己的解决方案。它使用Process Monitor,因为我相信它可以更好地覆盖所有类型的系统调用和历史稳定性。它配置,管理然后过滤Procmon日志文件。它是新的,但适用于我的设置。你可以找到它here。建议和意见表示赞赏。

答案 1 :(得分:0)

MSBuild在Windows上使用Tracker.exe https://msdn.microsoft.com/en-us/library/microsoft.build.utilities.filetracker%28v=vs.121%29.aspx,它执行您描述的内容并生成.tlog文件。 (我不知道如何通过编程方式/直接进行编程。)

(也不确定它是构建工具的一个很好的解决方案;例如cl.exe通过mspdbsrv.exe写入pdbs,这不是在同一个进程树中,所以我认为它会错过它。)