对象篇
模块化编程-自研模块加载器
开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】
专栏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能做到的!
GDIView工具则是排查GDI对象泄露的利器,可以查看到每种GDI对象的数目,这样就能看到具体是哪种GDI对象明显偏高了,这样我们就能有针对性的排查问题了。有时我们可能要使用历史版本比对法,使用二分法选择多个时间的软件版本去安装,看看问题是从哪一天出现的,然后查看前一天的代码修改记录或者底层库发布记录,就大概能确定问题范围了。
历史版本比对法,要依赖历史版本的维护,比如我们有自动化编译系统,如果当天有代码修改或者底层库发布,每天凌晨会自动更新代码并发起编译,并将编译出来的版本拷贝到专用的文件服务器上维护起来,如下所示:
颗粒度精细到每天,这样对有效实施历史版本比对法很重要!
关于使用GDIView排查GDI对象泄露的实例,可以查看我的文章:
使用GDIView工具排查GDI对象泄漏导致程序UI界面绘制异常的问题https://blog.csdn.net/chenlycly/article/details/128625868使用GDIView工具排查WebRTC开源库中的GDI对象泄漏问题https://blog.csdn.net/chenlycly/article/details/125399896
3、PE信息查看工具PeViewer/MiTeC EXE Explorer
目前主要用PE信息查看工具查看二进制文件的时间戳,即二进制文件生成的时间,通过时间戳可以确定二进制文件的版本。
我这边之前使用的PE信息查看工具叫PeViewer,有次在排查问题时发现,在用该工具打开一个64位二进制文件时发生了闪退崩溃。后来在网上搜到了MiTeC EXE Explorer工具,这个工具兼容性比较好,打开64位二进制文件没有问题。
使用PE工具排查问题的案例,可以查看我的文章:
使用PE信息查看工具和Beyond Compare文件比较工具排查dll文件版本不对的问题https://blog.csdn.net/chenlycly/article/details/135138815使用PE信息查看工具和Dependency Walker工具排查因为库版本不对导致程序启动报错的问题https://blog.csdn.net/chenlycly/article/details/135165307
4、进程信息查看工具Process Explorer
Process Explorer是微软提供的一个查看进程信息的工具,某些功能类似于Windows任务管理器,但功能要强大很多,是增强版的任务管理器。Process Explorer的主要功能有:
1)可以查看运行起来的程序在启动时传递的命令行参数。比如Chrome浏览器程序,启动时会启动多个进程,可以通过查看每个进程启动时传递的命令行参数去大概看出该进程是用来做什么的,比如用来做GPU加速、页面渲染等。
2)可以查看程序启动起来后都加载了哪些dll库。可以查看到dll库的路径等详细信息。可以用来确认动态加载的dll库有没有加载起来。
3)可以查看进程的各个线程的信息。比如查看线程的CPU占用比例,可以查看线程的实时函数调用堆栈,这对于分析死循环引起的高CPU占用问题非常有用。但Process Explorer查看线程的函数调用堆栈可能不太准确,可以尝试使用同类型工具Process Hacker
4)可以查看进程的GPU占用情况。以音视频处理为例,GPU占用分两类,一是播放视频时会用到GPU加速,二是视频硬编硬解会使用到GPU。如果要看GPU,建议使用Windows系统自带的任务管理器,显示的比较详细,如下:
使用Process Explorer排查程序高CPU占用的实例,可以查看我的文章:(有时可能需要使用到多个软件工具)
使用Process Explorer/Process Hacker和Windbg高效排查软件高CPU占用问题https://blog.csdn.net/chenlycly/article/details/134180480使用Process Explorer排查程序因为死循环导致线程堵塞的实例,可以查看我的文章:
使用Process Explorer和Windbg排查软件线程堵塞案例分享https://blog.csdn.net/chenlycly/article/details/135361532
5、进程监控工具Process Monitor
我们可以使用该工具监控目标程序对文件和注册表的操作情况,在监控到的条目中可以双击查看相关的函数调用堆栈,通过函数调用堆栈可以看到是哪些模块操作的,调用了哪些接口操作的。
对象篇
模块化编程-自研模块加载器
开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】
n.net/forums/4304bb5a486d4c3ab8389e65ecb71ac0)**