我正在尝试使用 Windows Server Core 在 Windows Docker 容器中构建一个控制台应用程序,如下所示这些说明来自微软。
我遇到的问题是,当在容器上运行时,应用程序退出时没有错误消息。我怀疑这是由于 Windows Server Core 上缺少系统 Dll 造成的,但与 Windows 桌面不同,没有应用程序弹出窗口来识别丢失的 dll。系统日志中也没有任何内容。
我还能做什么来解决这个问题?
答案1
对我有用(请参阅此处的详细说明https://stefanscherer.github.io/find-dependencies-in-windows-containers/):
- Azure VM Windows 服务器核心
- 安装 Procmon 并通过 iwr 下载过滤您的流程。
- 将您的 zip 放入 Azure BLOB 并通过 SAS url 下载,如果存档则进行 tar 展开
- 开始您的流程。
- 搜索失败/错误条目。
- 假设你丢失的 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
...