程序员突围-程序调试分析(一) 我从菜鸟进化的感悟

程序员突围-程序调试分析(一)

我从菜鸟进化的感悟

在说程序调试分析之前,我们还是了解一些基本的概念性的东西(在下现在从事java,因而都已java为例)

1. bug的分类

根据程序的阶段和MSDN和看过的一些书籍的分析,bug分为编译错误,运行时错误和逻辑的错误

(1)  编译错误

一般初学者犯错比较多的地方,编译错误,说白了就是程序在从java编译成.class文件时出现了问题,这个问题的现象比较明显,比如说语句写的有问题,那么对于这类问题的解决方法是什么呢,翻翻书,翻翻API(翻阅API和源码是很重要的一种能力哦)关于这方便的讲解,也就可以解决了.

(2) 运行时错误

运行时错误,就是程序在有.class文件加载到内存之后,开始运行时出现了问题,比如说,空指针异常,类转换异常,方法不存在,类找不到等等,关于这类问题的解决方法呢,这个是需要分类的,比如说采用的是框架级别,比如说公司内部框架或者第三方框架,对于这类呢,我只能说你问问公司的大牛,上网百度百度,能够搜索出来的问题都是小问题,在此呢,推荐一个比较好的国外技术网站,stackoverflow,相当专业的技术网站,,对于非框架级别,自己写的程序呢,看看日志或者控制台打印的错误的地方,一般在附近都能找到答案的,一眼看不到的呢,在报错位置的附近设置断点,看看相关联的几个变量的值

(3) 逻辑错误

什么叫逻辑错误呢,简单的说就是代码没有按照我们想要的流程往下走,现象嘛,代码编译没有问题,运行也没有问题,但是就是得不到想要的结果,经常听到别人说这样的几句话,为什么我的代码执行不到这里,为什么我的参数放进去了去不出来,为什么我修改了数据库后,数据库没有变化.

这类问题的解决方法是什么呢,先听听我下面分享的东东,大家也许就有点感悟了

2. 调试的原则

(1) 核心原则:了解需求

大家总是在听别人说,你帮我看看我这里哪里出了问题了,对于简单的demo类型,一般看看就知道是哪里出了问题,但是是复杂的问题呢,你能够在什么都不了解的情况下,直接帮别人解决bug吗,除非这些底层或者什么东西你就了然于心,我觉得在多数的情况下,我们还是要了解业务场景的,也就是这个方面的需求,需求,包括业务需求和书写代码此方法甚至此类的要实现的需求,有可能我们不需要知道业务需求,只需要知道此编码级别的需求即可,这个其实是要知道我们的业务数据流程和代码实际流程的真实走向.

(2) 核心原则: 对bug进行定位,也就是缩小排除无关代码

对于简单的bug,大家可能都知道,直接在附近debug一下就可以了,看看相关的变量,这个确实是个很通用的方法,但是对于一个大的功能模块甚至整个系统的bug呢,能够一眼看到bug吗,这就像是大海捞针一样,但是怎么能够在大海中捞针呢?运用核心原则1,我们了解需求后,我们大概对问题进行定位,就是讲业务数据流程和代码流程的整体流程中,撕开了一个口子,也就是确定了上边界和下边界的问题.

(3) 不能相信他说的此处没问题

在工作和学习中,总是能够遇到他人说这样的问题,他向你描述了一个bug的现象(完成了我们的原则1),但是他向你描述的时候,很多时候会说道这样一句话,我明明按照他的说法做了,但是就是没有出现预期的结果

此处呢,我们能相信的是什么,那就是他说的结果,什么呢,没有出现他想要的结果,那他说的前提条件可信吗,此处99%是不可信的,为什么不是完全不可信的呢,我们不可否认采用的框架中可能会有bug.为了避免我们给我们做一个错误的前提提交,我们需要将不可信的条件转为可信的条件,如何转换呢,此处可以直接采取debug的形式,在其说的没问题的地方的最后,我们设置断点,查看是否是预期的结果,如果不是的话,那么说明前提条件都是错误的,根据实际的个人经验,一般都是前提条件有问题的

3. bug的调试技巧

Bug调试技巧是要分类的,先说一下通用的,然后在将通用的进行具体实现和操作

(1) debug

debug模式大家肯定是要学习的,在程序学习的初期,大家不仅要学习如何写代码,更要学习如何debug,就是让程序停止到一个断点,不再往下进行,我们可以选择让程序一步一步执行,还是全部执行,在执行的过程中,我们还能看到相关变量的值和其变化

(2) 橡皮鸭调试法/泰迪熊调试法

这个方法也是比较常用的,其实大家平时就用过这种方式,就是在你向别人描述问题的时候,你突然就发现了问题,只不过大家没有重视这种方式而已,由于大家用的时候一般是与他人沟通,其实与他人沟通,面临一个他人是否在忙的状态,其实呢,我们是否和人沟通是不重要好的,我们是向把我们的逻辑说一遍,所以呢,我们可以选择和旁边的宠物先说一遍,具体做法呢,当你在想这只保持沉默的橡皮鸭/泰迪熊解释的过程中,你就发现你的想法,观点,思路和实际的代码偏离了,于是你就找到了代码中的bug.

一旦一个问题呗充分的描述了他的细节,那么解决方法也是显而易见的,或许你觉得这个方法太愚蠢,太弱智,但是这个是非常有效的一个方法,号称这个是Code Reviev的雏形

(3) java的debug

在说java的debug之前,大家可以对debug有一个基本的了解,debug模式,我们想看的是什么呢?数据的变化,程序的走向,数据的变化体现在哪些地方呢?就是在变量的窗口中,程序的走向呢?无非我们想控制程序是走一步,还是走多步,,走到指定的位置,以及是否进入方法中,这也就衍生出了不同的程序debug的通用模式,单步调试(单步调试分为单步调试进入方法内部,单步调试不进入方法内部),一直执行到下一个断点

Java的debug也不例外,大家可以看看相关debug的快捷键,自己写个例子,试试这种方式

要注意的是,由于java是可以多线程运行的,所以我们也可以看到多个线程同时处于debug,于是我们可以选择在哪个线程进行操作

(4) js的debug

通用在(3)中所描述的debug的一般特点,js中的debug也逃脱不了这几点,只不过快捷键不同,其实在java中经常写的system.out什么的方法在js中我们也可以alert一下,但是这种方式不建议使用,因为这样会破坏程序原来的结构

Js中有比较好用的工具是firebug,由于个人用chrome用习惯了,firebug没怎么用过,就不在这卖弄了.大家可以看看,听说是调试js的利器

(5) html的debug

大家可能要嘲笑我了,html怎么debug呢,我目前用的比较多的方法是给标签增加样式,常用的是增加边框或者背景色,由于个人使用的也不多,html的debug就介绍这么多,大家有好的方式方法请回复我,share and change!

4. 避免bug

(1) 一个方法内只做基本的操作,不做过于复杂的逻辑控制,一般一个方法的代码不超过一个屏幕的宽度,一个方法内部的代码量越大,越容易出现逻辑错误,并且方法内代码量过多,书写此方法也会浪费很多的时间

(2)    编码测试

很多人喜欢写一个大的模块之后进行测试,其实在写好一个比较关键的方法后,我们就应该测试一下,使用junit,我们可以在不破坏程序的基础上,就可以书写测试逻辑

5. 解决思路

因为bug的情况不同,我们的解决思路也是不同的,

在bug的分类中已经说到了一些bug的解决思路,这里再说一些其他的思路

(1) 控制台/日志确定bug的现象,如果日志或者控制台没有出现内容,那么这也是现象

(2) 根据现象,再根据业务需求/程序需求,有异常抛出,直接找到异常抛出的问题,对于能够看懂的异常,或者已经熟悉的异常,一般很快就能解决,对于不熟悉的异常,如果是简单的异常,那么自己找到bug的附近,梳理梳理逻辑,自己给自己讲讲这块的逻辑,试试能不能找到;如果梳理后不能找到,开启debug模式;对于仍然找不到的逻辑,如果是框架类的直接看官方文档或者搜索或者问大牛

总结:

程序调试分析的顶级核心是心态要好,心态不好的人,找问题思路是堵塞的,如果找不出来,记得出去溜达溜达,其实很多时候问题并不是在你坐在电脑前面拼命找到的bug,而是你出去溜达的时候,答案已经在你的心中(至于原因,可以看看<程序员的思维训练>)

程序员突围-程序调试分析(一) 我从菜鸟进化的感悟,布布扣,bubuko.com

时间: 2024-09-29 23:30:47

程序员突围-程序调试分析(一) 我从菜鸟进化的感悟的相关文章

程序员突围-程序调试分析(序)

-从实践到思考,痛苦的煎熬 其实算算,工作一年了,从大学毕业至今,接触编程已经五年了,但是真正的编程感觉还没有开始,从大一开始接触C语言,陆续接触c++,java,C#等等,现在感悟到了一点,编程语言学那么多有什么用呢?其实把一门编程语言学精了,学透了,其他的是触类旁通的(底层的C语言和C++可能有点例外),下面我会说一下我的经历,我感觉可能是大多数学习编程人的必经的阶段,让大家对编程的抵触少一些,然后想想一个我这样的白痴都能慢慢的开始程序调试,程序分析,你们绝对比我强的,下篇文章才会进入我的程

程序员应知 -- 如何分析海量数据

程序员应知 -- 如何分析海量数据 http://www.cnblogs.com/MicroTeam/archive/2010/12/03/1895071.html 在这个云计算热炒的时代,如果你没有处理过海量数据的话,你将不再是个合格的Coder.现在赶紧补补吧~ 前一阵子分析了一个将近1TB的数据群(gz文件,压缩率10%).因为第一次分析如此巨大的数据,没有经验,所以浪费了许多时间.下面是我整理的一些经验,方便后者. 欢迎各种补充,我会不断更新这篇文章:觉得有用的话,速度分享链接:有不同意

负能量程序员杂谈- 程序员这个职业

本系列文章仅从个人有限的对事物的认知出发,如有不同意见,请温和提出态度,毕竟都是成年人,别那么幼稚. 我一直都认为,任何正当的职业都一样,本质都是首先养活自己,在满足这个前提下实现为人民服务的崇高理想.我是一个程序员,我很喜欢我的职业和从事这个职业的大部分人. 程序员是一个很奇葩的职业,在外界很多人看来高科技,高智商,高收入的一群人.殊不知,绝大部分程序员都拿着一份不高的薪水,整天被苦逼项目弄到精力憔悴,乔帮主阵亡的时候还忙着改自己的签名:stay hungry stay foolish.哥,你

推荐一本好书给即将走入工作的程序员and程序媴

近期买了几本IT届推崇的经典书籍.当中有一本<程序猿修炼之道:专业程序猿必知的33个技巧>.由于这本比較薄,所以先翻着看. 这本书有别于其它的技术书籍,事实上算不上一本技术书籍.它不是教你怎么去提高编程,怎么去提高某方面的技术.我觉得这更像一本内功心法,教给你职场的一些软技能.强烈推荐给即将入职的朋友们.我好懊悔当初没有早点接触到这本书,曲曲折折走了不少弯路.如今读来,依旧感触体会非常深. 这本书很多其它的是告诉你,在工作岗位上怎样更有效的开展工作.当中有几点我想谈谈自己的看法. 拜师 基本每

你是哪种层次的程序员?程序员的四种类型

http://www.nowamagic.net/librarys/news/detail/1370不是每一个写代码的都是程序员.这里,我把程序员定义为以编程为生的人.我认为世界上存在四类程序员:科学家.码农.专家和工匠.下面我一一介绍自己的观点. 科学家,与其说他们是程序员,不如说他们是数学家.他们发明了各种理论.算法和术语,教科书上那冗长的证明和计算也出自他们之手,其他的程序员都或多或少受益于他们的成果.有时,他们的一篇论文能改变整个业界的思维方式,但他们通常不会也不喜欢把那惊世骇俗的理论商

又一个程序员倒下-程序员防猝死指南

就在上个月,这个视频在技术群里疯传,据传是一位24岁的程序员在工作中猝死,在为他惋惜的同时,希望借助这个事情来为大家的健康敲一个响钟. 视频链接:http://tieba.baidu.com/p/5857257985?qq-pf-to=pcqq.group 程序员在其职业生涯中,健康问题尤为突出.但是大部分程序员只顾码字,却往往忽略了自身的健康问题.这或许是因为写代码太入神,也或许是因为来自老板的压力太大.但这些并不是你折磨自己最好的理由,我们程序员也需要养生,只有懂得养生,才能更好地编程. 程

黑马程序员——C语言——内存分析

内存分析主要包括以下几部分内容:进制.类型说明符.位运算和关于char类型的一些内容. 一. 进制(二进制.八进制.十进制.十六进制) 1.二进制 ①  特点:只有0和1,逢2进1 ②  书写格式:0b或者0b开头 ③  使用场合:二进制指令\二进制文件,变量在内存中就是二进制存储 ④  二进制和十进制的互相转换 ⑤  n为二进制位所能表示的数据范围(不考虑负数):0~2的n次方-1 2.八进制 ①  特点:0~7,逢八进一 ②  书写格式:0开头 ③  八进制和二进制的互相转换 3. 十六进制

C++程序员的发展方向分析

我们 一路走来,磕磕碰碰,走到现在,历经了千辛万苦,实乃不易,可是路才刚刚开始走,未来还是很长,我将会不断的思考.      我想,如果是打算走进C++编程的同志朋友们,请好好看完这篇文章,或许,对你的发展有所启发.但是,不要企图在这里找到你自己发展的规划和指定好的发展航向 和行程.看了这篇文章,能够收到启发,受到鼓舞,也就是本文的一个成功的地方了.如果能够切实的给你指导发展方向,那更是荣幸备至.但是,每个人的兴趣都 不一样,所处的环境和条件也因人而异,所以,必定会有与你不完全符合的发展方向指导

程序员表白程序,开放源码,不断更新(第三篇:第二弹)

首先感谢hackerzhou同志,是他给了我激情和想法,感谢他的开源精神,造福大家. 这一波主要内容集中在网页这里,我一直想找一个通用或简易办法,能使大部分人都能使用"表白"这份礼物,如果使用网页,那么就要会建站,要服务器,要域名,除了代码还需要配置,有点麻烦,我这里使用的都是新浪云服务器,可以免费建一些网站,操作也比较简单,不会建站的可以来问我. 这一章的主要内容是展示这些表白的页面. 一.loveyue1 演示地址:http://loveyue1.sinaapp.com 效果如图: