我正在设计一个小型实用程序来帮助构建系统。我们的想法是该实用程序将启动每个编译器的每个实例,并输出编译期间编译器打开的所有文件的日志。类似的东西:
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)。
答案 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,这不是在同一个进程树中,所以我认为它会错过它。)