【转载】查看依赖关系 dependency walker(depends)

本文介绍了DependencyWalker这款工具,用于检查和解决Windows模块的加载问题,包括缺失模块、导出导入不匹配等。通过实例演示了如何使用它来分析程序的依赖关系以及处理函数缺失和动态库缺失的异常情况。
摘要由CSDN通过智能技术生成

简单介绍

Dependency Walker是一个免费的实用工具,它可以扫描任何32位或64位Windows模块(EXE,DLL,OCX,SYS等),并建立所有相关模块的分层树形图。Dependency Walker对于排除加载和执行模块故障错误非常有用。 Dependency Walker能检测出许多常见应用问题,例如缺少模块,无效的模块,导入/导出不匹配,循环依赖错误,不匹配的机器类型模块和模块初始化失败。所以对于程序员来说,Dependency Walker(以下简称Depends)是一项必备技能。

下载安装

Depends的下载地址为:http://www.dependencywalker.com/,选择相应的版本下载即可。

下载后进行解压缩,得到如下文件:

在这里插入图片描述
depends无需安装,直接点击depends.exe运行即可。

depends使用

有如下解决方案:一个解决方案中,有两个工程,一个是exe工程TestDll,另一个是动态库工程MyDllTestDll引用动态库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;
}

UseDllmain.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.dllMSVCP1400.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显示如下:
在这里插入图片描述

  • 4
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值