目录
1、为什么要学习C++软件调试技术?
1.1、IDE调试手段虽必不可少,但还不够
1.2、通过查看日志和代码去排查异常崩溃问题,费时费力,很难定位问题
1.3、有的问题很难复现,可能只在客户的环境才能复现
1.4、为了应对软件在不同环境中出现的各式各样的问题,我们需要掌握足够多的调试排查技术
1.5、掌握高效的调试分析技术,既能提升个人能力,也能体现个人价值
2、C++软件调试技术的主体内容
3、掌握C++软件调试技术都有哪些好处?
3.1、在了解引发异常的常见原因后,在编写代码时更小心
3.2、汇编语言接触的多了,能更好地理解软件底层的运行机制
3.3、排查问题的经验多了,处理新问题就更加得心应手了
3.4、在排查问题的过程中,可以主动地去发掘学习的机会,去扩充自己的视野
3.5、在问题中进步,在问题中总结
3.6、通过排查问题去积累素材,可以用到日常的技术分享与培训中
4、学习软件调试技术的经历与心得分享
4.1、学习软件调试技术经历分享
4.2、做技术分享的一些心得
VC++常用功能开发汇总(专栏文章列表,欢迎订阅,持续更新...)https://blog.csdn.net/chenlycly/article/details/124272585C++软件异常排查从入门到精通系列教程(专栏文章列表,欢迎订阅,持续更新...)https://blog.csdn.net/chenlycly/article/details/125529931 通过技术分享和线下交流发现,很多C++程序员在软件调试技术这一块都比较欠缺,无论是刚毕业的新手,还是工作多年的老员工。这里面有个人的原因,也有环境的原因。考察一个软件人员的水平,一是要看编码与架构的设计能力,二是要看软件调试能力。软件调试能力在处理项目上线后遇到的各式各样的问题时显得尤为重要。今天我们就来详细聊一下为什么要学习C++软件调试技术,以及学习C++软件调试技术有哪些好处。
1、为什么要学习C++软件调试技术?
在项目上线后,为了有效地应对软件使用过程中遇到的各式各样的问题,我们需要掌握多种软件调试手段和方法,要掌握常用的软件调试技巧,仅靠单一的技能是远远不够的。
1.1、IDE调试手段虽必不可少,但还不够
我们在项目开发联调阶段,会使用IDE进行Debug调试,将软件的基本流程和功能调通。由于Debug和Release下的差异,有些在Release版本出现的问题,在Debug下是没有的,没法通过Debug调试去解决的。
对于有些好复现的问题,我们还可以进行Release下的调试。IDE调试是我们处理问题的最直接、最基本的手段,但IDE调试不能覆盖所有的场景,比如产品进入测试或者发布上线后,有些问题是很难复现的,在Debug下可能是很难复现的,所以没法通过Debug调试去排查。
产品上线到客户环境后遇到了问题,基本是不可能到客户的环境中去调试代码的。所以仅仅依靠IDE调试去排查问题,是远远不够的。
1.2、通过查看日志和代码去排查异常崩溃问题,费时费力,很难定位问题
软件的运行日志是我们排查问题的重要手段。软件中的异常主要包括两大类:业务上的异常和软件异常崩溃。对于业务上的异常,可以通过打印日志去排查,在日志中查看软件的运行流程,还可以查看到相关变量的值,还可以结合抓网络包去分析。
但对于软件异常崩溃,在排查手段与方法上,与业务上的异常排查有很大的不同,一般仅通过日志打印去排查是行不通的,日志中没法找到软件崩溃点,很难找到引发软件崩溃的线索。日志不是排查软件异常崩溃的主要手段,日志仅仅起到辅助的作用,比如我们在找到软件崩溃点及崩溃时的函数调用堆栈后,可以通过日志去查看代码的运行流程及相关变量值去辅助分析引发崩溃的原因。
1.3、有的问题很难复现,可能只在客户的环境才能复现
有的软件异常问题很难复现,可能只能在客户的网络环境或者PC机器的软硬件环境中才能复现。对于这类问题,一般我们需要使用多种手段和方法去排查,是没法通过IDE调试去解决的。
如果软件有捕获到异常,生成了包含异常上下文的dump文件,我们可以取来dump文件用Windbg或gdb等调试器进行分析。如果没有生成dump文件,一般需要使用调试器在客户环境中进行动态调试,尝试去捕获异常信息。但在客户的机器上去动态调试有诸多的不便,比如问题很难复现,需要很多的时间去复现,会耽误客户很多的时间;有些安全等级比较高的涉密客户,是不允许在其机器上安装Windbg等调试器的。所以有时我们可以尝试在公司的环境中去复现问题,可能在长时间的拷机后可能会复现。
1.4、为了应对软件在不同环境中出现的各式各样的问题,我们需要掌握足够多的调试排查技术
为了应对软件在不同环境中出现的各式各样的问题,对问题做出快速的响应,我们要了解引发软件异常的常见原因,要知悉一些问题排查的手段与方法,要熟练使用各种常用的分析工具和调试工具。对于一些复杂的问题,需要将多种方法和手段结合起来,使用多种工具去联合分析。
但掌握这些知识和技能不是一撮而就的事情,需要脚踏实地来学习,然后把学到的东西应用到实际的项目中,要多动手多实践,在问题中取得进步,在问题中积累经验。
1.5、掌握高效的调试分析技术,既能提升个人能力,也能体现个人价值
掌握高效的调试分析技术后,可以处理各式各样的软件疑难问题,在处理问题的过程中个人能力和经验都能有效的提升。具备别人不具备的能力,能解决被人解决不了的问题,这样能够更好地体现出对企业的价值,这同时也是个人价值的体现。
2、C++软件调试技术的主体内容
通过大量的项目实战总结出来的C++调试技术的主要内容如下:
这个地方我就不再赘述了,C++调试技术的详细内容可以去查看专栏《C++软件调试与异常排查从入门到精通》:
C++软件调试与异常排查从入门到精通专栏https://blog.csdn.net/chenlycly/article/details/125529931
3、掌握C++软件调试技术都有哪些好处?
掌握大量的软件调试技术之后,最直接的好处就是能高效地分析并解决项目中遇到的各式各样的难题,下面我们来详细看看都有哪些具体的好处。
3.1、在了解引发异常的常见原因后,在编写代码时更小心
在系统地了解引发C++软件异常的常见原因之后,能让我们在编写代码时考虑的更加谨慎、更加全面,从一开始就把一些问题给规避掉,将问题扼杀在摇篮中。
3.2、汇编语言接触的多了,能更好地理解软件底层的运行机制
有时我们在排查软件异常时,特别是在缺乏pdb符号库文件时,我们需要用IDA查看相关二进制文件的汇编代码上下文去分析。这样就会接触底层的汇编代码,汇编代码熟悉了以后,就能更好的理解C++程序在CPU中怎么运行的,就能理解很多编程中的一些细节问题。
3.3、排查问题的经验多了,处理新问题就更加得心应手了
排查的问题越多,见识就越多,积累的经验就越多,这样在排查新的问题时手段就更多,思路会更加开阔,更加得心应手,定位问题的速度会更快。
3.4、在排查问题的过程中,可以主动地去发掘学习的机会,去扩充自己的视野
在和兄弟组一起联调排查问题时,在帮兄弟项目组排查异常崩溃时,可以查看到其他开发组的代码,可以理解他们代码中好的设计思想。也可以了解到他们模块中的业务流程,对把握整个系统的业务流程有很大的作用。
我们在日常工作中,要积极主动地发掘这样的学习机会,这些都能有效地扩充我们的视野和认知。
3.5、在问题中进步,在问题中总结
排查问题的过程,是不断积累经验的过程,是技术取得不断进步的过程。在问题排查出来后,要积极进行思考和总结,进行一些扩散性的延伸与归纳。通过项目实战,能学到很多通过经过实战检验的知识点,能搞懂以前无法理解的知识点,扩充自己的认知范围,对一些点能有更进一步的理解和认识。通过不断的思考与总结,可以形成一套属于自己的完整知识体系。比如我的技术总结专栏《C++软件调试与异常排查从入门到精通》就是总结出来的一套完整的知识体系:
C++软件调试与异常排查从入门到精通专栏https://blog.csdn.net/chenlycly/article/details/125529931
1)通过回顾很多异常问题的引发原因,总结出了《C++软件异常的常见原因分析与总结》一文:
C++软件异常的常见原因分析与总结https://blog.csdn.net/chenlycly/article/details/1249964732)通过回想很多异常问题的排查过程及排查方法,总结出了《排查C++软件异常的常见思路与方法》一文:
排查C++软件异常的常见思路与方法https://blog.csdn.net/chenlycly/article/details/1206293273)根据使用Visual Studio调试程序的实战经验,总结出了《Visual Studio高效调试手段与技巧总结》一文:
Visual Studio高效调试手段与技巧总结https://blog.csdn.net/chenlycly/article/details/1248842254)根据排查问题时的各种内存错误,总结出了《引发C++程序内存错误的常见原因分析与总结》
引发C++程序内存错误的常见原因分析与总结https://blog.csdn.net/chenlycly/article/details/128599525专栏《C++软件调试与异常排查从入门到精通》还有很多其他的文章,感兴趣的可以去专栏中看,这个地方我就不再逐一展开了。
3.6、通过排查问题去积累素材,可以用到日常的技术分享与培训中
在排查问题的过程中,可以将dump文件、pdb文件和相关代码截图保存下来,可以方便以后去查看,也可以为以后的技术分享与培训积累大量的案例和素材。这样的技术分享会更有内容,更富有实战性。
4、学习软件调试技术的经历与心得分享
最近几年一直在从事C++软件异常排查的工作,处理了成百上千个软件异常问题,正是通过这些问题的项目实战,积累了大量的经验,并做了详细的总结。《C++软件调试与异常排查从入门到精通》技术总结专栏,正是通过项目实战总结整理出来的:
C++软件调试与异常排查从入门到精通专栏https://blog.csdn.net/chenlycly/article/details/125529931专栏中的内容都是通过项目实战总结出来的实战经验,有很大的参考价值,感兴趣的可以去看一看!
4.1、学习软件调试技术经历分享
多年前,在遇到软件异常崩溃时排查起来非常吃力,深深地体会到了在C++软件调试方面的不足,并对C++软件调试技术产生了浓烈的兴趣。于是开始系统地学习软件调试方面的技术知识,动手捣鼓一些常用分析工具:
并坚持把这些知识和工具应用到日常的项目中去。
在学习应用的过程中,同事们也给予了大量的指导与帮助,特别是负责软件异常排查的同事给我分享大量的实战经验。就这样逐渐敲开了C++软件调试的大门,逐步承担起了部门C++软件项目中各种异常崩溃的排查工作。
在邀请公司技术专家排查项目难题的过程中,跟着专家后面也学到了很多平时学不到的分析经验,以及一些高效的分析工具。一边学习,一边排查问题,一边积累经验。
对于一些典型的有代表性的问题,事后会进行完整的复盘,搞清楚问题的来龙去脉,并对相关的技术点进行总结与进一步的思考。即便问题出在别的开发组的模块中,我也会主动地帮忙排查,查看他们模块的代码,把问题给搞清楚。在这个过程中,我不仅了解了底层模块的相关代码的设计思想和业务逻辑,还积累了大量的问题素材,为后期的全面总结做好了大量的知识储备。
4.2、做技术分享的一些心得
通过几年的软件异常排查项目实战,对C++软件调试与异常排查技术进行了系统地总结,并开始对外输出这方面的内容。在公司范围内开始做C++软件调试技术的分享与培训,在培训和交流的过程中发现很多C++程序员在软件调试这一块比较欠缺,无论是刚毕业的年轻人,还是工作多年的老程序员。这其中有一些个人的原因,也有一些环境认知的原因。
培训的过程中大家反映都很强烈,都惊叹于分析工具能如此高效的定位问题,都觉得培训内容很有实战参考价值。但很多人还是没能坚持学习,大多数基本都是三分钟热度,事后并没有主动地去研究去捣鼓常用的分析工具,并没有将相关内容和工具应用到实际的项目中去。
一门技术的学习,是离不开努力和折腾的,我们需要把手动起来!在我们漫长的职业生涯中,正是通过很多小事件从量变到质变,去实现技术的提升。