作为一名IT行业的从业人员,也是一名老程序员。现在主要在从事产品研发及项目管理工作,所以我来探讨一下这个问题。什么是Bug Bug一词的英文翻译为"臭虫子"或"虫子"。但是现在,我们认为是在电脑系统或者程序中,隐藏着一些未被发现的缺陷或漏洞问题,称之为Bug。 什么是Debug Debug是排除故障、排除问题的意思。 怎么提高自己的Debug能力的? 首先,良好的编码习惯和逻辑思维能力,对Bug有预见判断的能力。 作为程序员,应该有一个良好的编程习惯,不仅需要有良好的编码格式、命名规范,更为需要的是对于业务逻辑,实现时有良好的架构结构、数据结构、业务结构、程序安全等等方面的考虑。 其次,问题错误定位能力。 对于已发生的问题或bug进行分析、日志分析、业务逻辑分析、数据分析等等,对问题或bug进行初步定位。问题初步定位之后,在相关的程序节点进行输出或日志处理,不断的对问题进行跟踪和处理。 最后,对发生的Bug有感知能力。 当一个Bug出现的时候,优秀的程序员能根据Bug发生的前提和Bug发生的时间点、程序中的位置,很好的感知到Bug可能发生在哪一个函数或者哪几个函数中。 这些方法做着做着就习惯了或"不断能成功解决出现的问题或bug",谈不上坚持,最终成了喜欢的自己。 Debug的十八重境界: 第一重:Debug应用程序,需要源代码,依赖集成开发环境(IDE)下断点来调试。 第二重:Debug应用程序,需要源代码,只需要调试器下断点,即可调试。 第三重:Debug应用程序,需要源代码,不需要调试器,打Trace来调试。 第四重:Debug应用程序,只用肉眼浏览源代码,便可定位Bug、并做修复。 第五重:Debug应用程序,不需要源代码,但是需要崩溃转储文件,依赖调试器来调试。 第六重:Debug应用程序,不需要源代码,不需要转储文件,不需要调试器,只通过问题症状,便可定位Bug。 第七重:在第六重的基础上,开发热补丁。 第八重:Debug内核态程序,需要源代码,打Trace来调试。 第九重:Debug内核态程序,需要源代码,使用调试器来调试。 第十重:Debug内核态程序,用肉眼浏览源代码,便可定位Bug、并做修复。 第十一重:Debug内核态程序,不需要源代码,但是需要崩溃转储文件,依赖调试器来调试。 第十二重:Debug内核态程序,不需要源代码,不需要转储文件,不需要调试器,只通过问题症状,便可定位Bug。 第十三重:Debug BIOS/Bootload程序,需要源代码,利用超级终端来打Trace调试。 第十四重:Debug BIOS/Bootload程序,需要源代码,使用JTAG+超级终端或者MultiICE来调试。 第十五重:Debug BIOS/Bootload程序,需要源代码,只用肉眼浏览源代码,便可定位Bug、并做修复。 第十六重:Debug BIOS/Bootload程序,不需要源代码,使用JTAG+超级终端或者MultiICE来调试。 第十七重:使用逆向分析工具,进行逆向工程,定位Bug,并作补丁修复 第十八重:自行开发逆向分析工具,定位Bug,并作补丁修复 自行对照,看看达到第几重境界。 此外在前七重,根据鄙视链,还分成好几级: COM+/DCOM组件调试 > COM组件调试 > EJB调试 > 云原生调试 > DLL/.a调试 > 桌面可执行程序调试 > Web调试 …… 我做的是编程底层,写单片机程序。在调试功能或者查找Bug的时候,Debug功能简直就是神器,可以让你看到单片机是如何一步步执行程序的,变量值和当前的寄存器值都可以通过窗口看到。配合断点的使用,调试起来非常方便,很容易找到代码的问题所在。 对于比较主流的单片机,如ST、NXP、Microchip、MSP等,都有专用的IDE,如KEIL和IAR等。这两款软件都易上手、直观、人性化。以IAR为例,和大家分享一下Debug方法。1.编译并Download程序 程序编译没有问题后,可以通过Projcet-->DownLoad and Debug下载运行或者通过快捷键Ctrl+D。如下图。 2.设置断点 程序在全速执行时,碰到断点就会停下来,所以在需要调试的地方设置一个断点可以让程序停下来方便观察变量或者寄存器的状态。只需要在代码编辑区左侧鼠标左键点击一下就可以。如下图。 程序运行到断点的位置后,可以进行单步调试,程序就可以一步步的执行,我们可以很方便的观察到程序的执行顺序。3.观察窗 将鼠标停留在变量上,可以观察此时的变量值,但是不直观。IDE一般都有Watch Window,还是实时观察窗。 可以将全局变量添加到观察窗里观察变量值。普通的观察窗只有在程序停止时才能刷新变量值;而实时观察窗可以实时的显示变量值。4.观察Memory存储区 Debug时,还可以查看单片机的存储区,在调试Flash和Bootloader时非常实用,如下图所示。 Debug可以让我们看到单片机是如何执行的,可以帮助我们检查逻辑的严谨性,调试代码非常好用。 想要获得更多关于单片机、电子电路的知识,关注我吧。 每一种编程语言的Debug都不一样,我就以DELPHI的代码例子说一下。 procedure TForm1.Button1Click(Sender: TObject); var s:string; i:integer; begin Try s:="a"; i:=strtoint(s); except raise;//如果有错返回错误信息 end; end;看错误信息 当你执行上面的代码,把字符转化为整数的时候,就会产生错误英文信息。 这种信息一眼看过去,大概就知道他的意思,在开发环境的情况下显示出来,同时告诉你是在那一行代码的BUG。 如果不是在开发环境下,设计程序的时候,对于一些容易出错的代码,必须加上犯错保护,同时把那个错误信息显示出来。如下图 这样在程序运行的过程中,一看就知道问题所在。内存错误 这一类的错误是很难追踪,就是你最终到了你也看不懂。这个时候你就要靠经验了,一般来说,程序在读取内存地址冲突时候造成的。多写代码,多观察 任何程序都有BUG,只要你多写代码多观察,对于任何一个编程工具来说,他的错误都容易掌握。但如果你单纯理论上学习,没有实战过系统项目,那肯定是掌握不了DEBUG的方法的。 1.尽量写更细粒度的函数,按照功能划分,对每个函数进行debug,如果逻辑复杂就需要通过单元测试来定位问题,列举出所有边界情况,进行一一测试 2.如果想知道运行时各变量变化情况,则需要使用断点调试功能,一般用idea自带的断点调试或者使用gdb 3.肉眼debug也是相当需要的,能肉眼看出的问题就不要浪费时间去做1.2步骤 良好的编码格式规范和逻辑实现结构善于打印log或者使用相关工具敢于猜测,多打断点 从实际经历和心得体会来回答这个问题,希望对想学习或者正在学习的朋友有帮助。 初级阶段,熟悉需求。 要提高Debug能力,应当熟悉需求,把握好功能实现的方案和思路。经常使用的Debug手段有:单步调试,代码断点和数据断点,串口信息打印。这三大手段要相互交替使用,灵活使用,反复使用。总体来说,以代码和过程为中心点,围绕功能和实现方法进行调试。 中级阶段,熟悉架构。 这个阶段需要对系统和模块有所了解,对任务和线程有所了解,依靠的手段除了初级阶段的三种方式之后,更多的需要对整个系统的架构和功能模块有一定的了解和把握能力,把问题框到所用的架构中去定位和分析,学会让代码在脑海中试跑,适当地大胆地猜测问题出处,通过裁剪或者替换或者条件等多种方式去反复验证定位。 高级阶段,了解问题的本质。 这个阶段需要非常扎实的知识理论,非常丰富的项目经验,从原理到行业方案都有一定的见解。到了这个阶段,所谓的Debug能力,基本上已经是理论定位,实操验证。 如何提高Debug能力? 多想多做,每个程序员都是一步一步成长起来的,只不过有的人由于理论丰富而扎实,起点就高了那么一点点而已,大多数人都是靠着IDE提供的Debug辅助功能成长起来的。从上面的三个阶段来看,除了IDE本身,更多的是需要学习、总结、提升。如果你有多年的程序开发和调试经验,那么你会相信,很多时候Debug都是边猜边试,边测边想,边改边调。 还有一条很重要的方法,向项目组其他同事尤其是老员工请教,多沟通,多交流。三人行,必有我师。学习别人的经验和方法,特别是那些你感兴趣的或者你从来没有使用过的方法,也许真的很有帮助。你也可以在学习和使用的过程中,适当的变通或者改造,创新出更加适合的方法。 如果你的项目和硬件有关,Debug的时候一定要适当地合理地运用硬件工具。例如万用表,示波器,逻辑分析仪,真的非常有用。我是搞嵌入式软件开发的,我在开发和调试的过程中,就常常用到这些硬件仪器来定位和解决问题。 也许你会反驳,如果是老牛或者大咖,肯定是凭空分析,一次修改,一次通过。有没有这种可能呢?有,我自己也有这个能力,但是那些都是小问题或者确定性的问题,或者是经验问题。如果是一个创新性的重大问题,我不认为如此轻松就能解决,至少我没有那个能力,我也没有遇到有此能力的人。纵观所有的技术大牛或者大咖,解决问题的时候都会一定地反复的过程,否则就没有所谓的迭代了,也没有所谓的版本更新了。 设置断点 每个语义排查 首先理解代码的逻辑,具体这块是为了做什么?有什么目的。灵活使用优秀的开发工具,通过开发工具可以让你更好地掌控代码,毕竟运行起来,具体哪里出错了,为什么没有按照自己的逻辑走,前一行还是a,怎么运行了这一行变成了b,都可以用过开发工具的debug,来梳理。单步执行,跳步执行,这些debug的技巧一定要掌握。只要脑子不乱,配合开发工具的debug,写代码没那么难。 如何提高debug的能力呢?说到这,咱必须说说啦,编程过程中,由于人思维的考虑不周全,或者某一块地方逻辑不严谨。再或者程序运行的过慢,我们都可以统称为bug!!! 那么既然这些无法完全杜绝,那么,我们应该做的是分以下几步; 第一、首先尽量避免上述情况,每次做完一个功能首先自己审查一次 第二、当然是结合xdebug啦,咋们打断点,单步执行程序,找到错误地方,加以改正 第三、学习借鉴前辈们的,或者能力比自己优秀的编程大佬,虚心请教, 以上是小西瓜对于debug的简单总结…嘻嘻。 关注我,不迷路,小西瓜带你走上路!!