简单介绍
Dependency Walker
是一个免费的实用工具,它可以扫描任何32位或64位Windows模块(EXE,DLL,OCX,SYS等),并建立所有相关模块的分层树形图。Dependency Walker
对于排除加载和执行模块故障错误非常有用。 Dependency Walker
能检测出许多常见应用问题,例如缺少模块,无效的模块,导入/导出不匹配,循环依赖错误,不匹配的机器类型模块和模块初始化失败。所以对于程序员来说,Dependency Walker
(以下简称Depends)是一项必备技能。
下载安装
Depends的下载地址为:Dependency Walker (depends.exe) Home Page,选择相应的版本下载即可。
下载后进行解压缩,得到如下文件:
depends无需安装
,直接点击depends.exe
运行即可。
depends使用
有如下解决方案:一个解决方案中,有两个工程,一个是exe工程TestDll
,另一个是动态库工程MyDll
,TestDll
引用动态库MyDll
,
MyDll中导出函数如下:
头文件 algorithm.h
#pragma once__declspec(dllexport) int Add(int a, int b);
__declspec(dllexport) int Minus(int a, int b);
__declspec(dllexport) int Multiply(int a, int b);
__declspec(dllexport) int Devide(int a, int b);
实现文件algorithm.cpp
#pragma once#include "algorithm.h"int Add(int a, int b)
{return (a + b);
}int Minus(int a, int b)
{return (a - b);
}int Multiply(int a, int b)
{return a * b;
}int Devide(int a, int b)
{return a / b;
}
UseDll
中main.cpp代码如下
(另外需设置附加包含目录、附加库目录、附加依赖项,最后将MyDll.dll放入TestDll.exe的运行路径下):
#include <iostream>
#include "algorithm.h" int main()
{
int main()
{std::cout << "Hello World!\n";std::cout << Minus(1, 2) << std::endl;std::cout << Multiply(1, 2) << std::endl;return 0;
}
双击depends.exe
,主界面如下:
直接拖入目标exe文件或者dll文件(也可以点击菜单栏上的File,通过Open对话框来打开目标文件),运行界面如下:
圈选部分为TestDll.exe
的依赖关系,它依赖MyDll.dll
、MSVCP1400.DLL
等,其各自又依赖其他DLL。
从中可以看出其依赖的深度较大,一般只需要查看最顶层的三次依赖即可。
单击MyDll.dll
,运行界面如下:
界面右侧的Function
下的函数签名不太清晰,可以右键函数名,选择Undecorate C++ Functions
,将函数签名转换成更为易读的形式:
转换后的形式如下:
上部的圈选部分是MyDll.dll
的引用对象(也即TestDll.exe
)使用的导出函数,下部的圈选部分是MyDll.dll
所有的导出函数。从图中可以看出,MyDll
提供了4个函数而TestDll
只使用了其中的int Minus(int, int)
和int Mutiply(int, int)
。
另外,注意下其中的颜色标识, 上部的引用函数,如果在动态库中存在,显示为绿色
;如果不存在显示为红色
。下部的导出函数,如果被引用,显示成深蓝色
;如果未被引用,显示成灰色
。
异常分析
函数缺失
如果将MyDll
中的函数int Minus(int, int)
删除,重新生成MyDll.dll
,然后再次查看TestDll.exe
的依赖关系,显示如下:
此时,TestDll.exe
引用的两个函数:int Minus(int, int)
在MyDll.dll
中已不存在,所有显示成红色
;而int Multiply(int, int)
依旧存在,显示成绿色
。这时运行TestDll.exe
,会报错显示如下:
动态库缺失
另外,如果删除MyDll.dll
(MyDll.dll
位于TestDll.exe
同目录下),运行TestDll.exe
显示如下:
但是这个软件已经等值更新了
注意事项
Dependency Walker 不再活跃开发,最新版本可能不支持最新的Windows特性和模块。
2. Dependencies
Dependencies 是一个开源工具,用于分析 Windows 应用程序的依赖关系。它被设计为 Dependency Walker 的现代替代品,具有更好的兼容性和性能。以下是关于 Dependencies 的一些关键点:
2.1 功能特点
模块依赖性分析:
显示应用程序或模块所依赖的所有动态链接库(DLL)。
列出每个依赖模块的路径、版本信息、CPU架构等。
函数导入导出分析:
列出每个模块导入的函数及其来自的DLL。
列出每个模块导出的函数及其内存地址。
问题检测:
标识丢失的模块或无法加载的模块。
报告模块加载失败的原因,如找不到模块、路径问题、版本不匹配等。
现代化支持:
支持最新版本的 Windows 和 64 位应用程序。
提供比 Dependency Walker 更快的分析速度和更准确的结果。
2.2 使用方法
下载和安装:
从 Dependencies 的 GitHub 页面 下载最新版本。
GitCode - 全球开发者的开源社区,开源代码托管平台
解压后运行 DependenciesGui.exe 即可,无需额外安装。
打开文件:
启动 Dependencies,并使用“File”菜单中的“Open”选项,选择要分析的可执行文件或DLL。
查看模块依赖关系:
在主窗口中,将看到所选文件的模块树,展示了所有直接和间接依赖的模块。
点击每个模块,可以查看详细的属性和依赖关系。
查看导入和导出函数:
选择一个模块后,可以在下方的窗格中查看该模块导入和导出的函数列表。
检测问题:
在分析结果中,如果有任何丢失的模块或加载失败的问题,Dependencies 会用红色高亮显示。
2.3 注意事项
Dependencies 仍在活跃开发中,定期检查 GitHub 页面获取最新版本。
3. 总结
Dependencies 相当于是 Dependency Walker 的一个延续,且是开源的,一直有人维护,所以个人建议优先选择 Dependencies
参考链接:【转载】查看依赖关系 dependency walker(depends)-CSDN博客
参考链接:https://blog.csdn.net/qq_36536211/article/details/140072841