为什么要学习使用C++软件常用分析工具?学会这些工具都有哪些好处?

news2024/11/16 15:52:00

目录

1、为什么要学习使用C++软件常用分析工具?

2、C++常用分析工具有哪些?都能处理哪些具体的问题?

2.1、SPY++

2.2、Dependency Walker

2.3、GDIView

2.4、Process Explorer

2.5、Process Monitor

2.6、调试器Windbg

2.7、反汇编工具IDA

3、总结


VC++常用功能开发汇总(专栏文章列表,欢迎订阅,持续更新...)icon-default.png?t=N658https://blog.csdn.net/chenlycly/article/details/124272585C++软件异常排查从入门到精通系列教程(专栏文章列表,欢迎订阅,持续更新...)icon-default.png?t=N658https://blog.csdn.net/chenlycly/article/details/125529931C++软件分析工具案例集锦(专栏文章正在更新中...)icon-default.png?t=N658https://blog.csdn.net/chenlycly/article/details/131405795       通过线上交流和线下与多部门的同事日常接触,发现很多C++开发人员在C++软件发生问题或者异常时,分析问题的手段都比较单一,定位问题的效率比较低,有时甚至会影响工作及项目进度。掌握一些C++常用软件分析工具的使用是很有必要的。今天我们就来详细讲一讲为什么要学习C++常用软件分析工具,以及掌握这些工具的使用后有哪些好处。

1、为什么要学习使用C++软件常用分析工具?

       在项目上线后,为了有效地应对客户使用软件过程中遇到的各式各样的问题,我们需要掌握多种软件调试手段和方法,要熟练掌握排查软件异常问题的技巧,仅仅依靠单一的方式或手段是远远不够的。

        C++软件调试技术包含多方面的内容,掌握C++软件常用分析工具的使用,也是重要内容之一。掌握C++常用软件分析工具的使用,可以辅助分析多种C++软件问题,能有效地提高排查问题的效率。单一地依赖IDE开发工具去调试代码是远远不够的。对于较难复现的问题或者只在客户环境中才会出现的,亦或是只在客户个别电脑上才有的问题,要使用多种技术手段去排查。

       掌握常用工具的使用,能快速地分析和定位问题,可以搞定一般人搞不定的问题,这既是个人技能的体现,也是对公司价值的体现。

2、C++常用分析工具有哪些?都能处理哪些具体的问题?

       在C++软件开发和维护的过程中,会用到一些高效的软件分析工具去辅助分析和排查软件运行中遇到的各式各样的问题。日常使用的分析工具有SPY++、Dependency Walker、剪切板查看工具Clipbrd、 GDI对象查看工具GDIView、Process Explorer、Process Monitor、API Monitor、调试器Windbg、交互式反汇编工具IDA、抓包工具Wireshark等。

2.1、SPY++

       SPY++是微软Visual Studio自带的一个用来查看窗口属性、窗口消息、进程与线程的工具,在日常工作中处理UI窗口事务用的比较多。

       使用SPY++可以查看窗口的风格(比如WS_POPUP、WS_CHILD、WS_EX_TOOLWINDOW等)、窗口坐标与尺寸、窗口标题与窗口类名,使用这些信息可以去辅助排查UI窗口问题。

       通过查看窗口的类名,我们大概就能猜出对应如软件的UI界面是使用何种UI框架实现的,常用的UI界面框架有MFC、duilib、QT和Chrome浏览器UI组件。

      使用SPY++分析问题的实例,可以参见之前写的文章:
使用SPY++查看窗口信息去分析C++客户端UI软件问题https://blog.csdn.net/chenlycly/article/details/130280965

2.2、Dependency Walker

       使用Dependency Walker可以查看exe主程序都依赖了哪些dll库,以及dll库之间的依赖关系,主要用来排查因为库缺失或者库中接口缺失导致的程序启动失败或者动态加载的dll库加载失败的问题。

       exe程序启动时,会优先将它们依赖的dll库加载到进程空间中,然后再将exe程序加载起来,然后进入main函数运行起来。如果当前运行的系统中找不到依赖的dll库,或者在依赖的dll库中找不到调用的接口,都会导致程序启动流程终止,程序启动失败。在动态加载dll库时,和加载exe程序的流程是类似的。

       使用Dependency Walker排查问题的实例,可以参见之前的文章:
使用Process Explorer和Dependency Walker排查C++程序中dll库动态加载失败问题https://blog.csdn.net/chenlycly/article/details/130198751

2.3、GDIView

       使用GDIView可以查看进程的各种GDI对象占用数目及进程总GDI占用数,主要用来排查UI界面编程中的GDI对象泄漏问题。发生GDI对象泄漏时,先通过该工具确定是哪种GDI对象发生泄漏,然后有针对性地查看代码去分析。

在Windows系统中进程的总GDI对象数是有上限的,默认是10000个,当接近或达到这个上限时,GDI绘图函数就会执行失败,窗口显示异常,紧接着可能就会出现崩溃闪退。

       使用GDIView排查GDI泄漏的实例,可以参见之前写的文章:
使用GDIView工具排查GDI对象泄漏问题https://blog.csdn.net/chenlycly/article/details/125399896

2.4、Process Explorer

       Process Explorer工具类似于Windows系统的任务管理器,但其功能比Windows任务管理器要强大很多。Process Explorer的主要功能有以下几点:

1)查看进程启动时传入的命令行启动参数,比如chrome浏览器会启动多个进程,通过命令行参数去区分每个进程的用途。
2)查看进程加载了哪些dll库,以及这些库的完整路径。通过该类信息查看exe程序加载了哪些dll文件以及加载的dll库的路径,查看动态加载的dll库有没有加载起来。这个功能点比较常用,比如这个案例:

使用Process Explorer和Dependency Walker排查C++程序中dll库动态加载失败问题https://blog.csdn.net/chenlycly/article/details/130198751

3)查看进程的磁盘和网络使用统计信息。
4)查看进程的各个线程的信息,可以看到各线程的CPU占用比例和线程的函数调用堆栈。可以利用这点去排查程序的CPU高占用问题。这个功能点也比较常用,比如这个案例:
5)查看进程的GPU占用情况,判断程序是否使用GPU硬件编解码。
6)查看进程的虚拟内存的占用情况,Windows任务管理器看不到进程的总虚拟内存占用大小(只能看到物理内存相关信息),可以使用该工具去查看,可以辅助排查内存泄漏问题。
7)查看进程占用的句柄信息,比如文件句柄、线程句柄、注册表句柄等。进程的句柄个数也是有上限的,如果达到或超过进程总句柄的上限,会导致后续句柄的创建出问题。

2.5、Process Monitor

        使用Process Monitor主要用来监测目标程序的注册表活动和文件活动。可以通过对进程注册表活动的监测,可以搞清楚执行某个操作时读写了哪些注册表项,比如如下的案例:

使用Process Monitor探测Windows系统高DPI缩放设置的注册表项https://blog.csdn.net/chenlycly/article/details/130586460        可以通过对进程文件活动的监测,可以搞清楚某个文件是哪个模块生成的,比如这个案例:

使用Process Monitor探测日志文件是C++程序哪个模块生成的https://blog.csdn.net/chenlycly/article/details/130316761

2.6、调试器Windbg

        Windbg是微软提供的强大的调试器工具,是我们分析C++软件异常最常用、最重要的工具。有dump文件时,使用Windbg去静态分析dump文件;没有dump文件时,可以使用Windbg去动态调试。

       Windbg工具我们多次详细地讲到了,并撰写了多篇文章,此处我们就不再赘述了。可以查看一下之前写的几篇关于Windbg的文章:

Windbg调试工具介绍https://blog.csdn.net/chenlycly/article/details/125505992Windbg调试命令汇总https://blog.csdn.net/chenlycly/article/details/51711212使用Windbg静态分析dump文件的一般步骤及要点详解https://blog.csdn.net/chenlycly/article/details/130873143使用Windbg动态调试目标进程的一般步骤及要点详解https://blog.csdn.net/chenlycly/article/details/131029795

2.7、反汇编工具IDA

       有时我们需要查看汇编代码上下文去辅助排查问题,主要使用IDA工具去打开二进制文件查看二进制文件中的汇编代码。其实二进制文件中存放的是二进制机器码,二进制机器码和汇编代码是等价的,汇编代码是二进制机器码的助记符。

       IDA工具就是将二进制文件的二进制机器码翻译成汇编代码,这个过程也被称为反汇编。还有个逆向工程的概念,是通过汇编代码逆向推出程序的源码实现。

       关于如何使用IDA,可以查看我之前的文章:

IDA反汇编工具使用详解https://blog.csdn.net/chenlycly/article/details/120635120使用IDA查看汇编代码上下文去辅助排查C++软件异常问题https://blog.csdn.net/chenlycly/article/details/128942626

3、总结

       上面详细讲述了一些常用软件分析工具的作用和用途,并给出了相关的问题实例分析文章,有一定的实战参考价值。掌握这些常用的软件分析工具,在遇到问题时,可以有更多的手段和思路,可以使用多种方法,快速高效地定位问题。

        要多动手,多实践!在问题中成长,在问题中积累经验,解决的问题多了,见识的问题场景就多了,实战经验也就更丰富了,排查问题的思路就更开阔了。

        兴趣是最大的老师,与其说兴趣,还不如说好奇心和求知欲。好奇心(求知欲)很重要,有时会是一种无形的动力源泉,不管是学习技术,还是学习工具的使用,我们都需要有一定的好奇心。

       做一件事情可能并不难,难的是在于坚持;坚持一下可能也不难,难的是坚持到底!一门技术的学习,需要不断的努力和不懈的坚持,我们需要把手动起来,把所学的应用到工作实践中去,在学习中持续实践,在实践中持续学习!在我们漫长的职业生涯中,正是通过很多小事件从量变到质变,去实现技术的提升。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/734800.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Android 13 startActivity报错ActivityNotFoundException

最近遇到一个问题,就是在google pixel 4(android 13)的手机上startactivity的时候报错activity找不到,其他非13的是好的,这里对问题进行记录: 查阅google官方的文档,有这么一段话, …

前端mock数据的几种方式

前端mock数据的几种方式 前端在开发具体需求前,后端往往只提供接口文档,对于前端来说,最简单的方式就是把想要的数据写死在代码里进行开发,但这样的坏处就是和后端联调前还需要再把写死的数据从代码里删除,最好的方式…

开发中易犯错的事务问题

1.不指定rollbackFor 使用spring的声明式事务(即Transactional注解)时,如果不指定rollbackFor,那么当程序发生Error时,事务将不会回滚!!!显然这将导致数据不一致! 如下述…

spring8-getBean()方法使用

;:getBean使用,要传数据,一个是字符串, 就是文件里的UserService 而这里的UserService就是我们配置文件的id:,第一个API 第二个API可以传入一个字节码类型。 如果某一个容器存在多个&#xff…

windows系统如何部署nacos

1.安装nacos 去nacos github下载nacos最新稳定版本,我用的是nacos-server-2.2.3.zip,下载后解压 2.创建数据库 启动mysql,创建数据库nacos,数据库名字是从conf/application.properties文件获得的 把db这三行取消注释&#xff…

【Hello mysql】 mysql的约束

Mysql专栏:Mysql 本篇博客简介:介绍mysql的约束 mysql的约束 表的约束空属性默认值列描述zerofill主键自增长唯一键外键总结 表的约束 为什么要有约束? 我们在收集一些数据的时候会要求该数据必须存在 比如说像是国家在登记公民信息的时候身…

实验二 常用网络命令

实验目的 了解常用网络命令及其使用方法。通过网络命令了解网络状态,并利用网络命令对网络进行简单的操作。 实验原理 1. 通过 ping 命令检测网络故障 (1)命令格式: ping [-t] [-a] [-n count] [-l size] [-f] [-i TTL] [-v T…

conic-gradient

The conic-gradient() CSS function creates an image consisting of a gradient with color transitions rotated around a center point conic-gradient方法创建了一个由围绕中心点旋转渐变组成的图片 background: conic-gradient( red 6deg, orange 6deg 18deg, yellow…

位图|布隆过滤器模拟实现|STL源码剖析系列|手撕STL

今天博主给大家带来位图和布隆过滤器的模拟实现。 前言 那么这里博主先安利一下一些干货满满的专栏啦! 手撕数据结构https://blog.csdn.net/yu_cblog/category_11490888.html?spm1001.2014.3001.5482这里包含了博主很多的数据结构学习上的总结,每一篇…

并发编程 - 利用Event Bus模式实现目录文件变化捕捉

文章目录 Pre需求CodeDirectoryTargetMonitorFileChangeEventFileChangeListener测试 Pre 并发编程 - Event Bus 设计模式 需求 JDK自1.7版本后提供了WatchService类,该类可以基于事件通知的方式监控文件或者目录的任何变化,文件的改变相当于每一个事件…

Java继承和多态

文章目录 继承继承概念继承的语法 super关键字super和this继承方式多态多态的概念多态实现条件 重写重写和重载的区别 继承 Java中使用类对现实世界中实体来进行描述,类经过实例化之后的产物对象,则可以用来表示现实中的实体,事物之间可能会…

Linux 内核级通用内存池 —— kmalloc 体系

目录 kmalloc 内存池中都有哪些尺寸的内存块 kmalloc 内存池如何选取合适尺寸的内存块 kmalloc 内存池的整体架构 KMALLOC_RECLAIM 表示需要分配可以被回收的内存,RECLAIM 类型的内存页,不能移动,但是可以直接回收,比如文件缓存页…

【Linux】第一个Linux小程序——进度条

今天为大家带来一篇关于在Linux上编写的进度条小程序的博客。 正文 我们在日常生活中使用电子产品时,经常会遇到加载的过程,这时候这些加载界面总是会附带有一些进度条,这些进度条是加载进度的可视化图形,这篇文章我们就在Linux系…

基于云原生网关的全链路灰度实践

作者: 倪海峰(海迩) 前言 随着企业规模的不断扩大,传统单体应用已很难进一步支持业务的发展,业务的迭代速度已经难以满足业务的增长,此时企业会对应用系统做微服务化的改造,降低业务的耦合度&…

keepalived脑裂

keepalived脑裂及解决方法? 一.keepalived的脑裂是如何产生的?二、HAProxy1.HAProxy概念2.HAProxy主要特性3.HAProxy负载均衡策略 4.LVS nginx HAProxy的区别5.编译部署HAProxy 一.keepalived的脑裂是如何产生的? 脑裂:指在一个高…

Elasticsearch【优化、案例】(八)-全面详解(学习总结---从入门到深化)

目录 Elasticsearch集群_测试集群状态 Elasticsearch集群_故障应对&水平扩容 Elasticsearch优化_磁盘选择 Elasticsearch优化_分片策略 Elasticsearch优化_内存设置 Elasticsearch案例_需求说明 Elasticsearch案例_ES自动补全 Elasticsearch案例_创建索引 Elastic…

多元分类预测 | Matlab 鲸鱼算法(WOA)优化xgboost的分类预测模型,多特征输入模型,WOA-xgboost分类预测

文章目录 效果一览文章概述部分源码参考资料效果一览 文章概述 多元分类预测 | Matlab 鲸鱼算法(WOA)优化xgboost的分类预测模型,多特征输入模型,WOA-xgboost分类预测 多特征输入单输出的二分类及多分类模型。程序内注释详细,直接替换数据就可以用。程序语言为matlab,程序可…

MySQL查询作业

一、单表查询练习 1、查询出部门编号为30的所有员工 2、所有销售员的姓名、编号和部门编号。 3、找出奖金高于工资的员工。 4、找出奖金高于工资60%的员工。 5、找出部门编号为10中所有经理,和部门编号为20中所有销售员的详细资料。 6、找出部门编号为10中…

【三】部署zabbix-proxy代理服务器和高可用,以及监控windows系统和java应用

zabbix代理服务器和高可用 1.部署zabbix代理服务器1.1 代理端zabbix-proxy配置1.2 客户端zabbix-agent配置1.3 zabbix-proxy总结 2. 部署Zabbix高可用集群2.1 主节点zabbix-server配置2.2 备节点zabbix-server配置2.3 客户端zabbix_agent配置2.4 Zabbix高可用集群总结 3.Zabbix…

JavaScript异步编程:(回调函数、Promise、async/await、Generator)

文章目录 前言1. 回调函数1.1. 回调函数的基本概念和使用方法1.2. 回调函数的优缺点和注意事项1.3. 回调地狱和如何避免 2. Promise2.1. Promise 的基本概念和使用方法2.2. Promise 的状态和状态转换2.3. Promise 的链式调用和错误处理2.4. Promise.all 和 Promise.race 的使用…