为什么要学习C++软件调试技术?掌握调试技术都有哪些好处?

news2025/2/26 22:54:20

目录

1、为什么要学习C++软件调试技术?

1.1、IDE调试手段虽必不可少,但还不够

1.2、通过查看日志和代码去排查异常崩溃问题,费时费力,很难定位问

1.3、有的问题很难复现,可能只在客户的环境才能复现

1.4、开发联调工期有限,必须在短时间内快速定位并解决问题

1.5、为了应对软件在不同环境中出现的各式各样的问题,我们需要掌握足够多的调试排查技术

1.6、掌握高效的调试分析技术,既能提升个人能力,也能体现个人价值

2、C++软件调试技术的主体内容

3、掌握C++软件调试技术都有哪些好处?

3.1、在了解引发异常的常见原因后,在编写代码时更小心

3.2、汇编语言接触的多了,能更好地理解软件底层的运行机制

3.3、排查问题多了,见识和经验就多了,处理新问题就更加得心应手了

3.4、在排查问题的过程中,可以主动地去发掘学习的机会,去扩充自己的视野

3.5、在问题中进步,在问题中总结

3.6、通过排查问题去积累素材,可以用到日常的技术分享与培训中

4、学习软件调试技术的经历与心得分享

4.1、学习软件调试技术经历分享

4.2、做技术分享的一些心得


VC++常用功能开发汇总(专栏文章列表,欢迎订阅,持续更新...)icon-default.png?t=N4N7https://blog.csdn.net/chenlycly/article/details/124272585C++软件异常排查从入门到精通系列教程(专栏文章列表,欢迎订阅,持续更新...)icon-default.png?t=N4N7https://blog.csdn.net/chenlycly/article/details/125529931C++软件分析工具案例集锦(正在更新中...)icon-default.png?t=N4N7https://blog.csdn.net/chenlycly/category_12279968.html       通过技术分享和线下交流发现,很多C++开发人员在C++软件调试技术这一块比较欠缺,无论是刚毕业的新手,还是工作多年的老员工。这里面有个人的原因,也有环境的因素。考察一个软件开发人员的水平,一是要看编码与架构设计能力,二是要看软件调试能力。高水平的软件调试能力在处理项目上线后遇到的各式各样问题时显得尤为重要。今天我们就来详细讲一讲为什么要学习C++软件调试技术,以及学习C++软件调试技术有哪些好处。

1、为什么要学习C++软件调试技术?

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

1.1、IDE调试手段虽必不可少,但还不够

       我们在项目初期的开发联调阶段,会使用IDE工具对代码进行Debug调试,将软件的基本流程和功能调通。由于Debug和Release下存在差异(比如变量是否会自动初始化及内存管理上的差异),有些问题只出现在Release版本中,在Debug下是没有的,这类问题没法通过Debug调试去排查的。

       对于有些好复现的问题,我们可以进行Release下的调试。此外,除了直接的Debug和Release下的调试,还可以进行附加到进程调试。附加到进程调试,对于调试底层的单个模块是很好用的。

       IDE调试是我们处理问题的最直接、最基本的手段,但IDE调试不能覆盖所有的场景,比如产品进入测试或发布上线后,有些问题是很难复现的,,所以没法通过Debug和Release调试去排查。

       此外,产品上线到客户环境后遇到了问题,某些问题与客户的环境有着直接的关系,即只在客户端环境中才有问题。可能是客户的网络环境、系统版本或特殊的硬件配置导致的,问题只在客户的环境中出现,在我们厂商的内部测试环境中很难复现,像这类问题就不好去进行代码调试了,基本不可能到客户的环境中去调试代码的。所以仅仅依靠IDE调试去排查问题,是远远不够的。

1.2、通过查看日志和代码去排查异常崩溃问题,费时费力,很难定位问

       为了排查软件在运行过程中遇到的问题,们会在软件中添加大量的打印日志,软件的运行日志是我们排查问题的重要手段。
软件中的异常主要包括两大类:业务逻辑上的异常和软件异常崩溃。

       对于业务上的异常,可以通过打印日志去排查,通过运行日志去查看软件的运行流程和执行轨迹,还可以将相关变量的值打印出来,根据变量的值去辅助分析。此外,对于某些场景,还需要使用抓包工具去抓网络包分析。

       对于软件异常崩溃,在排查手段与方法上,与业务上的异常排查有很大的不同,一般仅通过日志打印去排查崩溃问题,是很难定位的。因为日志中没法找到软件的崩溃点,很难找到引发软件崩溃的线索。

       日志不是排查软件异常崩溃的主要手段,日志仅仅起到辅助的作用,比如我们在找到软件崩溃点及崩溃时的函数调用堆栈后,可以通过日志去查看代码的运行流程与执行轨迹,以及相关变量值去辅助分析引发崩溃的原因。

1.3、有的问题很难复现,可能只在客户的环境才能复现

       有的软件异常问题很难复现,可能只在客户的网络环境或者PC机器的软硬件环境中才能复现。对于这类问题,一般我们需要使用多种手段和方法去排查,没法通过IDE调试去解决。

        如果软件有捕获到异常,生成了包含异常上下文的dump文件,我们可以取来dump文件用Windbg或gdb等调试器进行分析。如果没有生成dump文件或者dump文件中看不到有效的信息,一般需要使用调试器到客户环境中进行动态调试,尝试去捕获有效的异常信息。

       但在客户的机器上去动态调试有诸多的不便,比如问题很难复现,需要很多的时间去复现,这样就会耽误客户很多的时间。有些安全等级比较高的涉密客户,是不允许在其机器上安装Windbg调试器等软件的。

       所以有时我们可以尝试在我们公司的环境中去复现问题,可能在长时间的拷机后可能会复现。在公司环境中复现问题,排查起来就方便很多了。

1.4、开发联调工期有限,必须在短时间内快速定位并解决问题

       当项目处于功能联调阶段,发生异常崩溃处的代码很关键,是业务流程的必经之处,此处出问题,这块业务就没法继续联调了,如果项目工期有限,不能在这个问题上耗费太多的时间,需要尽快排查出来。

       还有一种场景,为了项目竞标(打标),需要在一两天或较短时间内开发出一个新功能,时间非常有限,如果在测试时遇到异常崩溃,需要快速解决问题。

       对于上述场景下的问题,需要使用多种分析手段和技巧去快速地定位。

1.5、为了应对软件在不同环境中出现的各式各样的问题,我们需要掌握足够多的调试排查技术

       为了应对软件在不同环境中出现的各式各样的问题,对问题做出快速的响应,我们要系统地了解引发软件异常的常见原因,要知悉一些常用问题排查的手段与方法,要熟练使用各种常用的分析工具和调试工具去排查。对于一些复杂的问题,需要将多种方法和手段结合起来,使用多种工具去联合分析。
但掌握这些知识和技能不是一撮而就的事情,需要脚踏实地来学习,然后把学到的东西应用到实际的项目中,要多动手多实践,在问题中取得进步,在问题中积累经验。

1.6、掌握高效的调试分析技术,既能提升个人能力,也能体现个人价值

       掌握高效的调试分析技术后,可以处理各式各样的软件疑难问题,在处理问题的过程中个人能力和经验都能得到有效地提升,可以积累大量的问题排查素材,可以形成一套完整的技能体系。具备别人不具备的软件调试能力,能解决别人搞不定的问题,这样能更好地体现出对企业的价值,这同时也是个人价值的体现。

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中是如何运行的,就能理解很多编程中之前理解不了的问题。

       熟悉汇编代码,不仅可以辅助排查C++软件异常问题,还可以理解很多高级语言不好理解的编程细节(从汇编代码的角度可以看到代码的完整执行细节)!汇编代码才能最直接、最本真地反映出具体的细节!很多高级语言难以理解的编程点和细节,从汇编的角度去看,要好理解很多!

        比如在《Windows核心编程》一书中,在第八章讲到多线程同步时,有个典型的多线程操作一个全局变量的实例,相关代码如下:

// define a global variable
long g_x = 0;

DWORD WINAPI ThreadFunc1(PVOID pvParam)
{
    g_x++;
    return 0;
}

DWORD WINAPI ThreadFunc2(PVOID pvParam)
{
    g_x++;
    return 0;
}

上述代码中,定义了一个long型的全局变量,然后创建了两个线程,线程函数分别是ThreadFunc1和ThreadFunc2,这两个线程函数中均对g_x变量进行自加操作(在访问共享变量g_x时未加锁同步)。在两个线程函数执行完后,g_x的值不一定为2。这个实例需要从汇编代码的角度去理解,从C++角度则不好理解,这是一个从汇编代码去理解代码执行细节的典型实例。关于这一实例的详细解读,后面我会专门写一篇文章去阐述,此处就不再展开了。

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++程序员在软件调试这一块比较欠缺,无论是刚毕业的年轻人,还是工作多年的老程序员。这其中有一些个人的原因,也有一些环境认知的原因。

开发人员调试能力比较弱,可能有环境的原因,可能也有个人的原因。可能工作环境中同事们很少使用专用的调试器和分析工具去排查问题,无法接触到系统的调试技术。还有一种可能,工作环境中有些同事会系统地使用调试技术去解决问题,并在部门或者小组中做过详细的技术分享,大家也有去听课学习,但大部分人都是三分钟热度,根本没有认真学,没有坚持下去,没有主动将所学的内容用到工作实践中去。学习技术,就是要投入大量的时间和精力,要不断的捣鼓和实践,把技术用到工作实践中去才能学出个样子的!

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

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

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

相关文章

使用git远程上传github

如果你不是很熟悉git,在使用git前请先对你的项目进行备份 进入本地文件目录,打开git的cmd界面(Git Bash Here)如果当面目录使用过git,有.git隐藏文件,则跳过第二步,没有则输入以下命令 git ini…

零基础如何自学网络安全?

第一阶段:学习一种或几种编程语言。 网络安全也属于计算机范畴,涉及到IT行业的,编程语言是不可难免的。 《Head First Python(第2版)》 作为一种高级编程语言,Python越来越受到网络专家的欢迎。它之所以吸引人,主要…

【Java 28岁了】一个有趣的例子,再推荐一些经典好书(文末惊喜福利)

文章目录 1 写在前面2 C语言与Java语言的互相调用2.1 C语言调用Java语言2.2 Java语言调用C语言 3 友情推荐4 更多分享 1 写在前面 众所周知,C语言和Java语言是两种不同的编程语言,它们的关系可以描述为Java语言是在C语言的基础上发展而来的一种高级编程…

内网如何映射到公网访问互联网

我们通常会根据本地应用场景来选择合适的中间件来搭建服务器。tomcat、 apache是比较常用的搭建服务器的中间件,它们之间还是有一些区别差异的。在内网本地部署搭建服务器后,还可以通过快解析端口映射方法,将内网应用地址发布到互联网&#x…

Springboot +spring security,使用过滤器方式实现验证码功能

一.简介 在前面文章章节通过自定义认证器实现了验证码功能,这篇文章使用过滤器来实现验证码功能。 二.思路分析 实现逻辑和通过过滤器实现json格式登录一样,需要继承UsernamePasswordAuthenticationFilter,所以文档这块主要记录下代码实现…

每日一题——两数之和(返回下标和返回数值两种情况)

每日一题 两数之和 题目链接 思路 注:本题只采用暴力解法,时间复杂度为O(n2),如果采用哈希表,可以将时间复杂度降到O(n),但由于笔者还未对哈希表展开学习,故不做讨论 我们直接用两层for循环来解决问题 第…

安装部署 Mastodon 长毛象去中心化微博系统

注意:本文采用的为 Docker Compose 方式安装部署。 首先选择你安装的版本,有以下两种推荐: 官方版本: https://github.com/mastodon/mastodonGlitch 版本: https://github.com/glitch-soc/mastodon 项目包含一个 Doc…

不同的去耦电容 阻抗VS频率

不同的去耦电容 阻抗VS频率 • 并联电容可以在一个较宽的频带内降低阻抗 • 小的去耦电容尽可能靠近电源引脚 为什么每个电源引脚都需要去耦 去耦电容总结 • 旁路电容离电容引脚尽可能的近 • SMT磁珠对于降低Ripple非常有效 • 高频时需要地平面 – 最小化寄生参数 • 使用…

记两道小明文攻击题

题一 题目描述: flag **************************** flag "asfajgfbiagbwe" p getPrime(2048) q getPrime(2048) m1 bytes_to_long(bytes(flag.encode()))e1e2 3087 n p*q print()flag1 pow(m1,e1,n) flag2 pow(m1,e2,n) print(flag1 str(fla…

MATLAB 搜索某一点的R邻域点 (13)

MATLAB 搜索某一点的R邻域点 (13) 前言一、算法介绍1.1 :无序点云的R邻域点搜索1.2 :有序点云的R邻域点搜索二、具体实现示例2.1 算法一 (含详细注释)2.2 算法二 (含详细注释)前言 在点云处理中,最基本的算法之一就是搜索某一点的近邻点,这在重叠区域确定,点云密度…

Spring Gateway使用JWT实现统一身份认证

在开发集群式或分布式服务时,鉴权是最重要的一步,为了方便对请求统一鉴权,一般都是会放在网关中进行处理。目前非常流行的一种方案是使用JWT,详细的使用说明,可以找相关的资料查阅,这里先不进行深入的引用了…

鲸图知识图谱平台,助力金融业务深度洞察(上)

导语 大数据时代的背景下,数据早就成为数字经济重要的生产资料。对数据的挖掘能力成为企业数字化转型的驱动力。就金融行业来说,如果经营和管理方式跟不上大数据时代的发展脚步就会使得数据价值无法得到充分发挥。知识图谱作为一个结合了知识存储、知识…

SpringCloud入门概述;微服务入门概述

微服务入门概述 入门概述微服务分布式微服务架构Spring Cloud技术栈spring cloud各个组件的使用服务注册服务调用服务降级服务网关服务配置服务总线 参考 入门概述 auther JaneOnly date 2022/11/6 前置课程需要: java8mavengitNginxmqspringboot2.0 微服务 微服务架构就是一…

【阅读笔记】概率预测之DeepAR(含Pytorch代码实现)

本文作为自己阅读论文后的总结和思考,不涉及论文翻译和模型解读,适合大家阅读完论文后交流想法,关于论文翻译可以查看参考文献。论文地址:https://arxiv.org/abs/1704.04110 DeepAR 一. 全文总结二. 研究方法三. 结论四. 创新点五…

软件设计师--考前查漏补缺

软件设计师 上午题一、计算机系统二、操作系统三、数据库技术四、计算机网络五、软件工程概论六、程序设计语言与编译原理七、数据结构与算法八、算法分析与设计九、其他:标准化与知识产权、英语 下午题一、结构化分析设计二、数据库分析技术三、面向对象分析技术四…

代码随想录算法训练营第十四天|二叉树的遍历

这里主要掌握两种遍历方法:递归法和迭代法 递归法: 1、确定递归函数的参数和返回值,这里参数就是节点和用于存放节点数值的vector。 2、确认终止条件,这里的终止条件是节点为空。 3、确定单层递归逻辑,根据前序、中序…

随身WIFI折腾日记(三)---Docker+ssh远程访问+青龙面板

四、安装Docker 安装完Docker以后,我们便可以一键部署一些服务上去了。 sudo curl -fsSL get.docker.com -o get-docker.sh # 下载安装脚本 \&& sudo sh get-docker.sh --mirror Aliyun # 执行安装脚本 \&& sudo systemctl enable docker # 加入开…

一篇文章弄懂卷积神经网络基础概念

文章目录 一篇文章弄懂卷积神经网络基础概念下采样和上采样卷积普通卷积空洞卷积转置卷积膨胀卷积和转置卷积的区别 池化最大池化平均池化 全连接 一篇文章弄懂卷积神经网络基础概念 卷积神经网络可以说是图像处理的天花板,也是当下图像处理在深度学习方面最热门的…

2023/5/23总结

super关键字 super关键字的用法和this 关键字的用法相似 this:代表本类对象的引用(this关键字指向调用该方法的对象一般我们是在当前类中使用this关键字,所以我们常说this代表本类对象的引用)super:代表父类存储空间的标识(可以理解为父类对象…

AGV/AMR控制器--仙工

AGV/AMR控制器--仙工 1 行业介绍1.1 控制器概念1.2 行业发展1.3 竞争格局 2 仙工控制器 SRC2.1 介绍2.2 优势标准化软硬件,适配多种运动模型超强适配性,适配各大品牌支持车型多样,应对场景复杂灵活应对非标需求 2.3 产品矩阵2.4 实施工具Robo…