记录进程加载的DLL

时间:2012-08-14 14:01:20

标签: windows dll profiling

我想在我们的单元测试中添加日志记录,记录他们使用的DLL以及它们从哪里加载。

我可以从Sysinternals ListDLL获取我需要的信息,但我需要在测试过程运行时运行它,并且我最终会遇到竞争条件:例如,ListDLL也可以运行早期,错过了在测试运行中途加载的DLL;在测试过程退出后,或者ListDLL可能运行得太晚。

同样,我可以从Visual Studio调试器的输出和模块窗口获取所需的信息,但我想在我们的构建服务器上自动执行此操作。

是否有任何命令行工具可以运行任意EXE,跟踪它使用的DLL,并将信息记录到文件中?

3 个答案:

答案 0 :(得分:2)

您可以编写自己的工具,它将使用“调试”功能。此工具必须

  1. 暂停新流程
  2. 作为调试程序附加到已创建的进程
  3. 处理调试事件,我记得你需要LOAD_DLL_DEBUG_EVENT
  4. http://msdn.microsoft.com/en-us/library/windows/desktop/ms679302(v=vs.85).aspx

答案 1 :(得分:1)

好消息:使用Detours自行编写并不太难。挂钩LoadLibraryA / W函数并将DLL名称记录到文件中(使用GetModuleFileName对应真实LoadLibrary返回的值)。还可以挂钩CreateProcess,以便您可以记录子进程加载的DLL。

坏消息:我希望能够发布我使用过的源代码,但这是一个我无法分享的内部工具。

编辑:我不相信这个工具的Detours挂钩是完全可靠的,因为在我的测试中,它错过了一些DLL。以下是使用调试器API的替代工具:https://github.com/timrobinson/logdlls

答案 2 :(得分:0)

请注意,SysInternals(现在是MSFT:http://technet.microsoft.com/en-US/sysinternals)有一个很好的工具,用于跟踪加载应用程序时发生的各种事件:Process Monitor。您必须过滤掉与您正在检查的应用程序无关的任何内容。此外,您可能需要设置Operation =“Load Image”过滤器。

尝试了Tim Robinson的工具,但它似乎只跟踪Windows相关的dll,因此在我的情况下没用。