就今天使用第三方工具PeViewer.exe遇到的release版本发布问题,简单地讲一下如何使用Dependency Walker和Process Explorer这两个常用的软件。文中内容比较简单,旨在介绍工具如何使用,给新人们提供一个参考!
1、问题描述
今天同事那边启动我们的软件报错了,怀疑是底层路版本不对导致的。于是将之前从网上下载的查看PeViewer工具发给她,结果她那边启动这个工具也报错,如下所示:
PeViewer工具可以查看二进制文件的PE信息,我们平时主要用来查看dll或exe文件的时间戳,确定是否是指定的版本。
对于老程序而言,这种问题很简单,这是典型的release版本发布时库缺失问题。但这个工具在我机器上运行没问题,应该是我系统目录中有该工具依赖的库,而同事机器上没有,所以同事那边运行出错。
这是软件开发新手经常容易犯错的地方,发布release版本时应该将依赖的运行时库和MFC库都一起打包带上。这个工具虽然文件不全,但是挺好用的,决定在我机器上找到依赖的三个库,放到PeViewer.exe同级目录下,PeViewer.exe就可以正常使用了。
2、使用Dependency Walker查看PeViewer.exe依赖了哪些dll库文件
于是使用Dependency Walker打开PeViewer.exe文件,看看该工具都依赖哪些库。打开后发现,系统库之外主要依赖VS2003版本的运行时库和MFC库:
msvcp71.dll、msvcr71.dll、mfc71.dll。
Dependency Walker主要用来查看库的依赖关系,以及库中的导出导入接口等信息
msvcp71.dll、msvcr71.dll、mfc71.dll这几个库对应的是VS2003,库编号与VS版本的对应关系如下:
那如何找到这三个库在我机器上的路径呢?很多人可能会说,拿文件名直接在磁盘上搜索啊!也可以使用快速查找工具Everything搜索的!这里推荐大家使用免费的快速搜索工具Everything,很好用,搜索速度比磁盘上搜索要快的多!我们可以使用Process Explorer工具来查得文件路径信息。
3、使用Process Explorer找到PeViewer.exe依赖的库
其实,有时库名称一样,版本可能不一样。可以将PeViewer.exe在我机器上跑起来,然后使用Process Explorer工具查看到依赖的库在哪个路径中,直接拷贝过来就好了。
Process Explorer由以下几个用途:
1)可以查看目标进程依赖的库信息,比如库的路径、版本等信息,可以确任动态启动的库有没有启动起来。
2)可以查看目标进程中的线程信息,比如CPU及内存的占用、线程中的函数调用堆栈等。可以使用该工具排查目标进程CPU占用高的问题。
如果是第一次使用,Process Explorer是看不到目标进程的库列表的,需要点击工具栏一个图标,才能切换出来:
找到依赖的库条目:
在列表中找到运行时库,右键点击,查看属性:
点击打开文件所在路径,即进入对应路径中拷贝出文件即可。需要的这三个库,都是在系统路径中:
拷贝到PeViewer.exe路径中,打包发给同事,同事那边就能正常运行了。
4、新人发布库时需要了解的注意事项
新人发布release版本程序时,要留意一下,一定要把依赖的非系统库带上!
其实发布release时不想带着运行时库和MFC库,可以选择在工程属性中配置使用静态运行时库和静态MFC库就好了,相关配置截图如下:
5、最后
使用PeViewer.exe工具查看目标二进制文件的时间戳的入口如下所示:
至于Dependency Walker和Process Explorer这两个工具软件,比文中用到的功能大的多,后面我们会详细讲解这两个工具软件的功能和应用场景。