3、PE信息查看工具PeViewer/MiTeC EXE Explorer
C++软件异常排查从入门到精通系列教程(专栏文章列表,欢迎订阅,持续更新…)https://blog.csdn.net/chenlycly/article/details/125529931VC++常用功能开发汇总(专栏文章列表,欢迎订阅,持续更新…)
https://blog.csdn.net/chenlycly/article/details/124272585C++软件分析工具从入门到精通案例集锦(专栏文章正在更新中…)
https://blog.csdn.net/chenlycly/article/details/131405795C/C++基础与进阶(专栏文章,持续更新中…)
https://blog.csdn.net/chenlycly/category_11931267.html开源组件及数据库技术(专栏文章,持续更新中…)
https://blog.csdn.net/chenlycly/category_12458859.html网络编程与网络问题分享(专栏文章,持续更新中…)
https://blog.csdn.net/chenlycly/category_2276111.html 在分析C++软件问题时,我们时常需要使用一些常用的软件分析工具,比如Dependency Walker、GDIview、PeViewer/MiTeC EXE Explorer、Process Explorer、Process Monitor和API Monitor等。今天就来详解介绍一下使用这些工具分析问题的案例集锦。
1、库依赖关系查看工具Dependency Walker
Dependency Walker主要用来查看库与库的依赖关系,用来排查因为库版本或者库缺失引发的程序启动报错、动态加载的dll库加载失败的问题。
程序启动时,会优先将exe主程序依赖的各个dll库加载到进程空间中,在加载某个dll库时会优先将其依赖的dll库加载到进程空间中,最后等所有依赖的dll库都加载起来后,最后将主程序加载起来,进入主程序的main函数,程序进而运行起来。如果在加载dll库时失败,则整个程序的启动过程会终止,程序启动失败。
程序因为库问题问题导致程序启动失败,主要有两种原因:
**1)可能在运行的机器上缺少dll库。**比如缺少业务库或者C/C++运行时库,即在加载库时报错;
**2)也有可能时在加载某个dll模块时发现其调用的另一个dll库的接口在该dll中找不到。**这个一般是因为库与库之间的版本不一致导致的。
这两类问题排查起来很简单,只要用Dependency Walker打开exe主程序或者出问题的dll库,即可查看到缺少哪些库以及哪些接口在被依赖的dll库中找不到。
使用Dependency Walker排查程序启动报错问题的案例,可以查看我之前写的文章:(有时需要将几个工具结合起来去分析)
使用Dependency Walker和Process Explorer排查瑞芯微工具软件RKPQTool.exe启动报错问题https://blog.csdn.net/chenlycly/article/details/135229025使用PE信息查看工具和Dependency Walker工具排查因为库版本不对导致程序启动报错的问题
https://blog.csdn.net/chenlycly/article/details/135165307使用Dependency Walker和Process Explorer排查程序启动时缺少ucrtbase.dll等运行时库以及报0xC000007B错误
https://blog.csdn.net/chenlycly/article/details/131505299 有时有些dll库是在程序启动时动态启动的,比如软件可以根据自己的业务需要,选择性其启动一些模块,就可以采用动态启动的方式。如果动态加载的dll库有问题加载不起来了,启动exe主程序时是不会报错的。我们需要根据相关业务是否正常去判断对应的dll模块有没有启动起来,我们可以使用Process Explorer去查看目标进程加载的dll库列表,如果列表中没看到目标dll库,则说明该dll库加载失败了。
使用Process Explorer和Dependency Walker排查动态加载的库加载失败的案例,可以查看我之前写的文章:
但Dependency Walker目前有个较大的问题,在Win10等较新的操作系统上打开文件时非常慢,有时要等好几分钟,夸张的时候甚至要等十来分钟!因为Dependency Walker最后一个版本是2006的,至今没有出过新版本了,如下所示:
可能是对Win10等新系统兼容不好,导致打开文件特别慢。
大家可以使用github上开源的一个叫做Dependencies的开源工具(Dependencies - An open-source modern Dependency Walker),这个工具打开文件特别快,如下所示:
这是一个网上的朋友推荐的!这个Dependencies工具是开源的,github地址为:https://github.com/lucasg/Dependencies ,需要的话,可以到该地址上去下载该工具。
在这里,给大家重点推荐一下我的几个热门畅销专栏:
专栏1:(该专栏订阅量接近350个,有很强的实战参考价值,广受好评!专栏文章持续更新中,预计更新到200篇以上!)
C++软件调试与异常排查从入门到精通系列文章汇总https://blog.csdn.net/chenlycly/article/details/125529931
本专栏根据近几年C++软件异常排查的项目实践,系统地总结了引发C++软件异常的常见原因以及排查C++软件异常的常用思路与方法,详细讲述了C++软件的调试方法与手段,以图文并茂的方式给出具体的实战问题分析实例,带领大家逐步掌握C++软件调试与异常排查的相关技术,适合基础进阶和想做技术提升的相关C++开发人员!
专栏中的文章均是通过项目实战总结出来的(通过项目实战积累了大量的异常排查素材和案例),有很强的实战参考价值!专栏文章还在持续更新中,预计文章篇数能更新到200篇以上!
专栏2:
C/C++基础与进阶(专栏文章,持续更新中…)https://blog.csdn.net/chenlycly/category_11931267.html
以多年的开发实战为基础,总结并讲解一些的C/C++基础与进阶内容,以图文并茂的方式对相关知识点进行详细地展开与阐述!专栏涉及了C/C++领域的多个方面的内容,同时给出C/C++及网络方面的常见笔试面试题,并详细讲述Visual Studio常用调试手段与技巧!
专栏3:
开源组件及数据库技术https://blog.csdn.net/chenlycly/category_12458859.html
以多年的开发实战为基础,分享一些开源组件及数据库技术!
2、GDI对象查看工具GDIview
在Windows程序中很多的绘图操作都是使用系统的GDI对象去完成的,比如输出文字、绘制线条、绘制图片等,常见的GDI对象包括Pen画笔、Brush画刷、Font字体、Bitmap位图、Region区域、DC设备上下文等。在绘制操作完成后需要将GDI对象释放掉,否则会造成GDI对象泄露。
如果有GDI对象泄露的代码在持续不断的执行,会导致GDI对象持续的泄露,而一个进程的GDI对象总数是有上限的(默认上限值是10000个),如果程序占用的GDI对象接近或达到上限,会导致绘制操作出现失败或异常,紧接着就会发生闪退崩溃。
如何判断程序运行过程中是否有GDI对象泄露呢?其实很简单,只需要打开Windows任务管理器:
持续的观察程序的GDI对象总数是否在持续不断地上升,如果在持续上升,则说明有GDI对象泄露。
Windows任务管理器的进程列表中默认是不显示GDI列的,可以右键点击进程列表的标题栏,在弹出的右键菜单中点击“选择列”,然后再弹出的窗口中勾选“GDI对象”就可以了,如下所示:
Windows任务管理器中只能看到进程占用的GDI对象总数,但看不到具体对象的数目,这恰恰是GDiView能做到的!
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
真正的技术提升。**
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!