今天给客户安装版本的时候,出现了"The specified module could not be found. (Exception from HRESULT: 0x8007007E)"的错误提示。这个错误的原因是存在无法调用的dll。排查了半天时间,发现这个错误是由第三方的类库报出来的,而且它并没有返回具体的哪一个dll无法找到,就只能慢慢查找原因。
排查问题的时候,发现两个很好用的工具。一个是Dumpbin,它可以查看这个dll加载了哪些dll项。一个是depends.exe,它可以构建相关模块的分层树状图。
1. Dumpbin的介绍及使用
Dumpbin是Visual Studio自带的工具, 查看方式为:开始->所有程序->Microsoft Visual Studio 2012->Visual Studio Tools ->“Visual Studio 命令提示(2012)”。
Dumpbin查看相关dll的命令如下: Dumpbin -imports 完整路径。例如我想查看C:\Windows\System32\SensApi.dll的相关dll,那么直接输入Dumpbin -imports C:\Windows\System32\SensApi.dll就可以了。Dumpbin还有一些其他的功能,这里就不详述了。
2. depends的介绍及使用
还有一个很好用的工具是:depends.exe。它可以构建相关模块的分层树状图。如果存在无法调用的dll,它可以将错误的dll信息显示出来,这样就很容易排查到具体的specified mode。depends.exe的官方地址为https://dependencywalker.com/。直接通过File -> Open,打开需要查看的模块就可以了。