记录进程加载的动态链接库(DLL)

6
我想要在我们的单元测试中添加日志记录,记录它们使用的DLL以及它们加载的位置。
我可以从Sysinternals ListDLLs获取所需的信息,但我需要在测试进程运行时运行它,并且我会遇到竞争条件:例如,ListDLLs可能会运行得太早,错过了测试运行过程中加载的DLL的一半;或者ListDLLs可能会在测试进程退出后运行得太晚。
同样地,我可以从Visual Studio调试器的输出和模块窗口获取所需的信息,但我希望在我们的构建服务器上自动化此过程。
是否有任何命令行工具可以运行任意EXE,跟踪它使用的DLL,并将信息记录到文件中?

也许这个可以帮到你:http://www.codeproject.com/Articles/301/Display-Loaded-Modules-v1-5 - Xearinox
@Xearinox - 谢谢,这与ListDLLs类似。我想要一个命令行工具,可以跟踪进程加载的DLL,并在进程退出时编写报告。 - Tim Robinson
3个回答

3

感谢@Maximus - 我也是这个想法,然后写了自己的工具来完成这个功能:https://github.com/timrobinson/logdlls - Tim Robinson

2
请注意,SysInternals(现在为MSFT:http://technet.microsoft.com/en-US/sysinternals)有一个很好的工具用于跟踪加载应用程序时发生的各种事件:Process Monitor。您将不得不过滤掉与您正在检查的应用程序无关的任何内容。此外,您可能需要设置Operation =“Load Image”筛选器。
尝试了Tim Robinson的工具,但似乎它只会跟踪Windows相关的dll,因此在我的情况下无用。

1
好消息是:使用Detours自己编写它并不太难。钩取LoadLibraryA/W函数并将DLL名称记录到文件中(使用GetModuleFileName针对真实的LoadLibrary返回值)。还要钩取CreateProcess,以便记录子进程加载的DLL。
坏消息是:我想分享我使用的源代码,但这是一个内部工具,我无法分享。
编辑:我不确定这个工具的Detours钩子是否完全可靠,因为在我的测试中,它错过了一些DLL。这里有一个使用调试器API的替代工具:https://github.com/timrobinson/logdlls

  1. Detours不是免费的。
  2. 不过,这个建议在静态链接库上失败了。
- Maximus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接