将dumpbin从VS中抠出来,并使用dumpbin查看exe和dll库的依赖关系
Posted dvlinker
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了将dumpbin从VS中抠出来,并使用dumpbin查看exe和dll库的依赖关系相关的知识,希望对你有一定的参考价值。
目录
2、在开发的机器上使用dumpbin工具查看dll库的依赖关系
3、将dumpbin.exe从Visual Studio中抠出来
3.2、在cmd中运行dumpbin,提示找不到link.exe文件
3.3、再次运行dumpbin.exe提示找不到mspdb100.dll
最近,有个开发同时为了验证问题,需要将mediaxxx.dll从依赖该库的目标库中临时移除,在目标库中不再调用mediaxxx.dll库的导出接口,不再引入mediaxxx.dll对应的.lib文件,但启动exe主程序时还是报找不到mediaxxx.dll,代码中明明已经将对mediaxxx.dll库的引用都去掉了,为啥还会依赖mediaxxx.dll库呢?于是找到我帮忙分析一下,看一下到底还有哪个模块还依赖mediaxxx.dll库。
1、初步说明
这个可以使用Dependency Walker去查看exe主程序与底层的dll库的依赖关系,但该工具只能查看静态依赖的dll库,对于代码中使用LoadLibrary去动态加载的dll库,是查看不到的。我们的exe程序中确实有部分模块是动态加载的。
其实还有个更好用的工具dumpbin,这个工具是微软Visual Studio(IDE开发环境)自带的工具,位于VS的安装目录中。使用该工具可以查看exe和dll文件的依赖关系,可以查看exe和dll导入接口和导出接口等信息。
2、在开发的机器上使用dumpbin工具查看dll库的依赖关系
如何使用dumpbin工具呢?以Visual Studio 2010为例,可以到Windows开始菜单中找到Microsoft Visual Studio 2010节点,在该节点下找到如下截图中命令行入口:
点击菜单项弹出如下的命令行窗口,会自动切换到d:\\Program Files (x86)\\Microsoft Visual Studio 10.0\\VC路径中,然后可以在该命令行窗口中直接操作dumpbin.exe工具。
可以输入dumpbin /?命令,查看dumpbin.exe支持的命令行参数:
在本问题中我们使用/DEPENDENTS参数,就能查看到目标exe和dll的依赖的库信息。具体可以分别执行如下的命令,将目标路径下的所有dll和exe的依赖关系输出:
dumpbin /DEPENDENTS C:\\Users\\Administrator\\Desktop\\Debug\\*.dll
dumpbin /DEPENDENTS C:\\Users\\Administrator\\Desktop\\Debug\\*.exe
其中,/DEPENDENTS表示查看依赖关系。输出的结果如下所示:
直接在命令行中查看结果很不方便,我们可以使用“>”重定向符将输出结果重定向到txt文件中,方便查看搜索。命令如下:
dumpbin /DEPENDENTS C:\\Users\\Administrator\\Desktop\\Debug\\*.dll > E:\\0816-dll.txt
dumpbin /DEPENDENTS C:\\Users\\Administrator\\Desktop\\Debug\\*.exe > E:\\0816-exe.txt
输出到文件中查看就方便了,可以随意的搜索了。到E盘中打开txt文件,直接搜索mediaxxx.dll,就看到了还有哪个库还依赖mediaxxx.dll了,如下所示:
3、将dumpbin.exe从Visual Studio中抠出来
上诉方法只能在安装Visual Studio的机器上使用,但有时我们可能需要在没安装VS的机器上使用,所以决定将dumpbin工具从VS中抠出来,方便大家使用。
3.1、找到dumpbin.exe文件及其依赖的dll文件
启动Everything搜索工具,输入dumpbin.exe,看到如下的多个搜索结果:
Everything搜索工具是Windows平台上的文件搜索工具,可以搜索所有磁盘上的文件,比Windows系统自带的文件搜索要快很多,推荐大家使用。
其中D:\\Program Files (x86)\\Microsoft Visual Studio 10.0\\VC\\bin目录,就是VS的安装目录,将这个文件拷贝出来。
然后使用Dependency walker打开dumpbin.exe,看看该exe还依赖哪些库,如下所示:
只依赖Kernel32.dll和msvcr100.dll,Kernel32.dll是系统库,是系统自带的,我们不需要带上该库。msvcr100.dll是C运行时库,是安装VS时会拷贝到系统中的,需要带上的。使用Everything搜索一下msvcr100.dll,拷贝过来就可以了。
3.2、在cmd中运行dumpbin,提示找不到link.exe文件
我是将dumpbin工具的文件放置在C:\\Users\\Administrator\\Desktop\\dumpbin-2010目录中,打开cmd窗口,切换到该目录中,然后输入dumpbin /?命令,看看当前拷贝出来的dumpbin.exe能否正常运行。结果运行有问题,如下所示:
提示找不到link.exe。于是到dumpbin.exe所在路径D:\\Program Files (x86)\\Microsoft Visual Studio 10.0\\VC\\bin中,找到link.exe文件:
拷贝过来。
3.3、再次运行dumpbin.exe提示找不到mspdb100.dll
将link.exe文件拷贝过来后,再次在cmd窗口中运行dumpbin /?命令,结果还是有问题,如下所示:
提示找不到mspdb100.dll库。于是又用Everything搜索了一下mspdb100.dll:
将mspdb100.dll拷贝过来。然后再次运行就正常,于是输入dumpbin /?命令,就能将dumpbin.exe命令行支持的参数打印出来,如下所示:
以上是关于将dumpbin从VS中抠出来,并使用dumpbin查看exe和dll库的依赖关系的主要内容,如果未能解决你的问题,请参考以下文章
Windows下程序打包发布时的小技巧(使用Dependency Walker侦测不理想,改用VS自带的dumpbin则万无一失,还可查看dll导出的函数)