【问题标题】:What files does that program open (on Windows)?该程序会打开哪些文件(在 Windows 上)?
【发布时间】:2014-06-23 18:00:10
【问题描述】:

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

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

然后track-files 执行cc 并输出cc 打开的所有.h(和其他)文件。但是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。在大多数这些系统上,如果 LD_PRELOAD 之类的技巧不起作用,我也可以使用 strace

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

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

interposers on Windows 上已接受的答案指向 Microsoft Research 的 Detours,但这是专有的(并且他们为 64 位支持收取大笔费用(10000 美元!!!),所以这将使我的实用程序对几乎每个人都毫无价值(包括我)。另一个答案提到了一种叫做 WinAPI Override 的东西,但这显然是 32 位的。

肯定有一些可靠的、非专有的、程序化的方式可以在 Windows 上执行此操作。也许是一些跟踪 API?我很乐意仅支持更新版本的 Windows(例如 Windows 7 和 8)。

【问题讨论】:

  • this 之类的东西也许就是您要找的东西?我没有听说过它只有 32 位,但我想你只能用 64 位程序挂钩 64 位进程(同样适用于 32 位)。
  • 当然可以,因为Process Monitor可以做到;我认为使用文件系统过滤器驱动程序。

标签: windows build hook system-calls trace


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    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 写入 pdb,所以我认为它会错过。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-07
      • 1970-01-01
      • 1970-01-01
      • 2021-03-13
      • 1970-01-01
      • 2012-11-05
      • 2014-07-29
      • 1970-01-01
      相关资源
      最近更新 更多