在 Docker 中的 Windows Server Core 上查找丢失的 Dll

在 Docker 中的 Windows Server Core 上查找丢失的 Dll

我正在尝试使用 Windows Server Core 在 Windows Docker 容器中构建一个控制台应用程序,如下所示这些说明来自微软。

我遇到的问题是,当在容器上运行时,应用程序退出时没有错误消息。我怀疑这是由于 Windows Server Core 上缺少系统 Dll 造成的,但与 Windows 桌面不同,没有应用程序弹出窗口来识别丢失的 dll。系统日志中也没有任何内容。

我还能做什么来解决这个问题?

答案1

对我有用(请参阅此处的详细说明https://stefanscherer.github.io/find-dependencies-in-windows-containers/):

  1. Azure VM Windows 服务器核心
  2. 安装 Procmon 并通过 iwr 下载过滤您的流程。
  3. 将您的 zip 放入 Azure BLOB 并通过 SAS url 下载,如果存档则进行 tar 展开
  4. 开始您的流程。
  5. 搜索失败/错误条目。
  6. 假设你丢失的 DLL 不是 UI dll。因为 VM Windows Core 有 UI,而 docker 版本似乎没有。

答案2

如果有人正在寻找一种方法来找出没有 GUI 的容器中未找到/解析的 dll,几个小时后我找到了一个名为依赖项这是唯一真正帮助到我的。微软的垃圾桶仅解析了树的第一层,并且 cygwin 的 ldd 无法解析某些 DLL 的名称。

Dependencies.exe -chain my_executable.exe

依赖项可以构建一个包含所有正在递归加载的 DLL 的完整图表,并解析它们到系统的路径。然后,您可以通过搜索 NOT_FOUND 字符串,从该图表中轻松识别缺少的内容。

示例输出:

├ exe_dat.exe (ROOT) : ..\Release\exe_dat.exe 
|  ├ adtfstreaming_290.dll (ApplicationDirectory) : ..\Release\adtfstreaming_290.dll 
|  |  ├ MSVCP100.dll (WindowsFolder) : C:\Windows\system32\MSVCP100.dll 
|  |  |  ├ MSVCR100.dll (WindowsFolder) : C:\Windows\system32\MSVCR100.dll 
|  |  |  |  ├ KERNEL32.dll (WellKnownDlls) : C:\Windows\system32\kernel32.dll 
|  |  |  |  |  ├ api-ms-win-core-rtlsupport-l1-1-0.dll (ApiSetSchema) : C:\Windows\system32\ntdll.dll 
|  |  |  |  |  ├ ntdll.dll (WellKnownDlls) : C:\Windows\system32\ntdll.dll 
|  |  |  |  |  ├ KERNELBASE.dll (WellKnownDlls) : C:\Windows\system32\kernelbase.dll 
|  |  |  |  |  |  ├ ntdll.dll (WellKnownDlls) : C:\Windows\system32\ntdll.dll 
|  |  |  |  |  |  ├ api-ms-win-eventing-provider-l1-1-0.dll (ApiSetSchema) : C:\Windows\system32\kernelbase.dll 
|  |  |  |  |  |  ├ api-ms-win-core-apiquery-l1-1-0.dll (ApiSetSchema) : C:\Windows\system32\ntdll.dll 
|  |  |  |  |  |  ├ api-ms-win-core-apiquery-l1-1-1.dll (ApiSetSchema) : C:\Windows\system32\ntdll.dll 
|  |  |  |  |  |  ├ ext-ms-win-advapi32-registry-l1-1-0.dll (ApiSetSchema) : C:\Windows\system32\advapi32.dll 
...

相关内容