5

我想将日志记录添加到我们的单元测试中,以记录它们使用的 DLL 以及它们的加载位置。

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

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

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

4

3 回答 3

2

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

  1. 启动新进程暂停
  2. 作为调试器附加到创建的进程
  3. 处理调试事件,我记得,你需要 LOAD_DLL_DEBUG_EVENT

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

于 2012-08-16T06:01:36.780 回答
1

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

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

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

于 2012-08-15T11:03:32.327 回答
0

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

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

于 2014-02-18T03:20:10.613 回答