Windows 小记 22 —— 在 Windows 上排查 DLL 依赖问题

在 Windows 上,运行一些程序时,可能会遇到应用程序错误提示(硬错误消息框,或者其他由程序动态加载模块错误产生的提示框)。这些提示一般与进程初始化失败有关,此时需要重点关注进程的模块加载过程。

应用程序错误提示

一个非常有用的工具可以用来帮助调试这个问题,它叫做 Dependencies。可以从这里下载:Dependencies (Releases)

解压 Dependencies_x64_Release.zip 文件。在解压的文件夹中,您将找到我们将使用的工具,名为 DependenciesGUI.exe

以下是有关如何使用此工具调试 DLL 依赖问题的分步说明。

1)排查 DLL 模块缺失问题

以下是有关如何使用此工具调试 DLL 依赖问题的分步说明。

  1. DependenciesGUI.exe双击运行。打开后它将如下所示:

  2. 使用 Windows 资源管理器,转到安装 Audacity 的文件夹(通常为C:\Program Files\Audacity)。此文件夹中还有另一个名为 modules 的文件夹。进入此文件夹,查找名为 mod-openvino.dll 的文件。将此文件拖入 Dependencies 工具:

  3. 将会执行初步分析,结果如下图所示——结果显示无法找到任何 DLL:

  4. 我们需要将Audacity文件夹添加到搜索路径,以便该工具能够解析所需的 DLL。为此,请转到“Options”(选项),然后单击“Customize search folders”(自定义搜索文件夹)

  5. 在弹出的窗口中,点击新建(New),然后添加 Audacity 安装文件夹的路径。通常是C:\Program Files\Audacity

  6. 点击确定(OK)。列表中的大多数(或理想情况下是所有)依赖项都不再是红色。它应该看起来像这样:

  7. 列表中仍未解决的依赖项可能是导致您出现问题的原因。例如,下图演示了whisper.dll因某种原因缺失的环境:

希望您能在这里轻松发现一些缺失的 DLL。

2)排查 DLL 导入依赖缺失问题

跟 Dependency Walker 类似,Dependencies 显示各种依赖错误。缺失导入的模块将会在左侧依赖树形图中显示为粉色高亮的图标,并在光标悬停在模块标签上时,显示 “ xx 模块缺失导入条目” 的提示信息。双击模块标签,可以在右侧的依赖信息视图中看到模块的导入依赖,它显示所有需要的函数的列表。缺失或不匹配的函数将在 PI 列显示为颜色突出的图标(与常规颜色不同,如这里的紫色与绿色)。(PI 列的图标文字标识了函数的类型,可以有 C 风格或者 C++ 风格等)。

下图显示了程序在目标机器上出现了导入缺失的问题:

注意:导入缺失表明所需模块与本机上实际加载的模块不匹配,这是版本问题导致的。具体到系统模块,比如这里的 comctl32.dll 有多个版本共存,出现导入不匹配,则可能是因为程序的清单文件中 SxS 加载配置存在错误。

适用于旧系统的 Dependency Walker 工具中类似的功能如图所示:

好了,分享就到这里结束了。

Windows下,可以使用bat批处理脚本来批量检测远程端口。Telnet是一种远程终端连接服务,可以通过它来连接到远程主机的特定端口。以下是一个使用Telnet命令在批处理脚本中批量检测远程端口的例子: @echo off setlocal set ip_list=file_path\ip_list.txt set port=80 for /f %%i in (%ip_list%) do ( telnet %%i %port% | find "Connected" > nul if errorlevel 1 ( echo %%i:%port% is closed ) else ( echo %%i:%port% is open ) ) pause 在以上示例中,首先我们定义了要检测的IP列表文件的路径,即ip_list.txt文件,然后我们设定了要检测的端口号,此处设定为80端口。接着使用for循环读取ip_list.txt文件中的每个IP地址。 在每次循环中,我们使用telnet命令连接到远程主机的指定端口。如果端口成功连接,则表示端口是开放的,telnet命令的输出会包含"Connected"关键字。我们使用find命令查找telnet命令的输出中是否包含"Connected"关键字。 如果find命令找到了"Connected"关键字,则说明端口是开放的,我们将显示"IP地址:端口号 is open"的消息。否则,即端口未连接,我们将显示"IP地址:端口号 is closed"的消息。 最后,我们使用pause命令来暂停脚本的运行,以便我们可以查看检测结果。 需要注意的是,Telnet命令在默认情况下可能未启用,需要手动在Windows设置中启用Telnet客户端功能。此外,Telnet命令在Windows 10及更高版本中可能已被淘汰,可以考虑使用其他工具如ncat或PowerShell来代替Telnet命令进行远程端口检测。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

涟幽516

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值