2012-08-14 45 views
4

我想将日志记录添加到我们的单元测试中,记录它们使用的DLL以及它们从何处加载。由进程加载的日志DLL

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

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

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

+0

也许这可以帮助你:http://www.codeproject.com/Articles/301/Display-Loaded-Modules-v1-5 – Xearinox 2012-08-14 15:59:32

+0

@Xearinox - 谢谢,这与ListDLLs类似。我想要一个命令行工具,用于跟踪进程DLL的加载情况,并在进程存在时写入报告。 – 2012-08-14 16:22:56

回答

2

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

  1. 开始新的进程暂停
  2. 附加到创建过程调试
  3. 进程调试事件,我还记得,你需要LOAD_DLL_DEBUG_EVENT

http://msdn.microsoft.com/en-us/library/windows/desktop/ms679302(v=vs.85).aspx

+0

谢谢@Maximus - 我在想同样的思路,写下我自己的工具:https://github.com/timrobinson/logdlls – 2012-08-16 08:49:24

1

好消息:使用Detours自己写它并不难。钩住LoadLibraryA/W函数并将DLL名称记录到一个文件中(使用GetModuleFileName作为实际LoadLibrary返回的值)。另外挂钩CreateProcess,以便您可以记录由子进程加载的DLL。

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

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

+0

1.绕路不是免费的。 2.以为,这个建议在静态链接库上失败了。 – Maximus 2012-08-16 05:55:12

0

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

试过Tim Robinson的工具,但它似乎只会跟踪Windows相关的DLL,所以对我而言没有用处。