051 01 Android 零基础入门 01 Java基础语法 05 Java流程控制之循环结构 13 Eclipse下程序调试——debug入门1

051 01 Android 零基础入门 01 Java基础语法 05 Java流程控制之循环结构 13 Eclipse下程序调试——debug入门1

本文知识点: 程序调试——debug入门1

程序如何调试?——debug

工作中,开发人员和测试人员经常说,在找bug。那bug是什么呢?其实就是程序中的错误或者说是缺陷。为什么叫bug呢?

小故事时间:

bug英文是虫子的意思,为什么把错误叫虫子呢?

051 01 Android 零基础入门  01 Java基础语法 05 Java流程控制之循环结构 13 Eclipse下程序调试——debug入门1

故事要回到遥远的计算机产生的时代。

那时候的计算机都还是大型机,一间大房子只能放一个大型机的那种大型计算机,由于天气炎热,大家把房间的窗户打开了,这时候有一天发现,这机器宕机了。无论如何都无法重启,

051 01 Android 零基础入门  01 Java基础语法 05 Java流程控制之循环结构 13 Eclipse下程序调试——debug入门1

后来工作人员排查机器的问题,排查许久,才发现,是在机器的某个零部件上,一只小虫子被电死了。

051 01 Android 零基础入门  01 Java基础语法 05 Java流程控制之循环结构 13 Eclipse下程序调试——debug入门1

所以后来大家把软件缺陷叫bug(虫子),把寻找缺陷的过程叫做debug。

051 01 Android 零基础入门  01 Java基础语法 05 Java流程控制之循环结构 13 Eclipse下程序调试——debug入门1

调试有什么作用?

调试的过程其实就是寻找缺陷的过程,它就是使程序员能看清程序每一步的效果,在某行程序需要复杂代码查看结果的时候,可以使用debug进行调试,对比结果是否是自己预期的结果。

051 01 Android 零基础入门  01 Java基础语法 05 Java流程控制之循环结构 13 Eclipse下程序调试——debug入门1

我们debug调试的更多不是编译错误,而是逻辑错误。即程序能正确编译运行的前提下:程序实际的输出结果与预计结果不一致的错误。

那这时候,我们就需要debug去调试查看程序每一步的运行结果。查看程序中每一步运行时,变量的值是否是符合要求的。

通过实例分析调试的必要性

比如在求阶乘累加和的问题中,我们知道s=1这条语句是十分重要的。

051 01 Android 零基础入门  01 Java基础语法 05 Java流程控制之循环结构 13 Eclipse下程序调试——debug入门1

如果s不重置为1,在内重循环中进行阶乘运算的时候,s就会以之前运算过的值开始累乘。比如在求3的阶乘的时候,会在2的阶乘的基础上继续乘1乘2乘3,而不是直接1×2×3。所以我们在程序中进行了s=1的对s进行重置的操作。

051 01 Android 零基础入门  01 Java基础语法 05 Java流程控制之循环结构 13 Eclipse下程序调试——debug入门1

那如果刚好程序员在编写代码的时候,那么可能就会发现我们的运算结果特别大,是不符合实际的要求,那这个时候呢,他就需要进行调试,查看一下,每个变量的值是否满足要求。所以,这就是调试的必要性。

演示调试过程和步骤——通过简单的for循环求和示例演示

步骤:

1、设置断点

051 01 Android 零基础入门  01 Java基础语法 05 Java流程控制之循环结构 13 Eclipse下程序调试——debug入门1

什么是断点?从字面意思来看,也就是程序执行的过程中,执行到这个点的时候,程序就终止了。所以在调试的时候,我们需要设置一个终止点(即断点)的,就是让程序停到这个位置上,我们再查看结果。

断点可以设置多个,比如我要查看sum每一次的值的变化,我们就在程序第8行的位置,双击蓝色区域,会出现一个蓝色小点,这个就是断点breakpoint了。

051 01 Android 零基础入门  01 Java基础语法 05 Java流程控制之循环结构 13 Eclipse下程序调试——debug入门1

如果想取消断点怎么办?双击断点位置,断点就取消了。

051 01 Android 零基础入门  01 Java基础语法 05 Java流程控制之循环结构 13 Eclipse下程序调试——debug入门1

还可以通过鼠标右键点击断点位置,点击Toggle Breakpoint即可设置断点,再操作点击Toggle Breakpoint一下,就取消断点。

051 01 Android 零基础入门  01 Java基础语法 05 Java流程控制之循环结构 13 Eclipse下程序调试——debug入门1

断点可以设置多个,如下图设置多个断点:

051 01 Android 零基础入门  01 Java基础语法 05 Java流程控制之循环结构 13 Eclipse下程序调试——debug入门1

程序不设置短点的时候,一运行,就从头执行到尾,一下就显示输出结果了;而设置断点之后的程序,执行时,可以一步一步的进行单步调试也就是一行代码一行的执行。

2、执行调试

051 01 Android 零基础入门  01 Java基础语法 05 Java流程控制之循环结构 13 Eclipse下程序调试——debug入门1

断点设置好以后呢,我们就开始进行调试。以前我们在运行程序的时候,一般比如说,我们单击右键,点run as,再点击Java Application

051 01 Android 零基础入门  01 Java基础语法 05 Java流程控制之循环结构 13 Eclipse下程序调试——debug入门1

如果是调试程序,我们就右键、单击debug as ,之后单击Java Application

051 01 Android 零基础入门  01 Java基础语法 05 Java流程控制之循环结构 13 Eclipse下程序调试——debug入门1

也可以在菜单栏Run中点击Debug,或者直接按F11。都可以进行调试、

051 01 Android 零基础入门  01 Java基础语法 05 Java流程控制之循环结构 13 Eclipse下程序调试——debug入门1

或者在工具栏单击小虫子图标,进入debug视图、

051 01 Android 零基础入门  01 Java基础语法 05 Java流程控制之循环结构 13 Eclipse下程序调试——debug入门1

进入debug视图后,开始调试。调试窗口就比我们以前编写代码的窗口复杂一些了。

分析一下这些窗口:

Debug窗口:展示的是当前代码的类名.方法名 在程序中是第几行

051 01 Android 零基础入门  01 Java基础语法 05 Java流程控制之循环结构 13 Eclipse下程序调试——debug入门1

Variables窗口:变量窗口,查看程序中变量的状态(包含变量名和变量值的信息),主要的调试过程就是观察变量值每一步的变化

051 01 Android 零基础入门  01 Java基础语法 05 Java流程控制之循环结构 13 Eclipse下程序调试——debug入门1

Breakpoint窗口:查看断点,当前例子中主方法的第8行位置是断点的位置

051 01 Android 零基础入门  01 Java基础语法 05 Java流程控制之循环结构 13 Eclipse下程序调试——debug入门1

代码区域窗口:

051 01 Android 零基础入门  01 Java基础语法 05 Java流程控制之循环结构 13 Eclipse下程序调试——debug入门1

outline大纲窗口: 查看程序的文件目录层次结构——包、类、方法。

051 01 Android 零基础入门  01 Java基础语法 05 Java流程控制之循环结构 13 Eclipse下程序调试——debug入门1

最下方是console控制台窗口

051 01 Android 零基础入门  01 Java基础语法 05 Java流程控制之循环结构 13 Eclipse下程序调试——debug入门1

3、单步调试

051 01 Android 零基础入门  01 Java基础语法 05 Java流程控制之循环结构 13 Eclipse下程序调试——debug入门1

介绍一些快捷键:

F6:单步调试快捷键,单步调试是指一步一步向下执行

051 01 Android 零基础入门  01 Java基础语法 05 Java流程控制之循环结构 13 Eclipse下程序调试——debug入门1

等后面继续学习,讲到Java方法的时候,还有一个快捷键F5,F5是在运行到自定义方法的时候,会跳到方法里去执行。这个我们暂时没学到就先忽略。

我们着重介绍F6快捷键的使用。

在菜单栏的Run中,我们也能找到F5、F6快捷键

051 01 Android 零基础入门  01 Java基础语法 05 Java流程控制之循环结构 13 Eclipse下程序调试——debug入门1

在程序中,我们在第8行设置了断点,就是表明我们程序执行到第8行的时候会中止,就在第8行停下了,所以我们看到控制台中没有输出结果。

051 01 Android 零基础入门  01 Java基础语法 05 Java流程控制之循环结构 13 Eclipse下程序调试——debug入门1

这个程序如果在不设置断点的情况下,会输出一个“sum=某数”的结果,但设置断点后,程序中止,console控制台就没有输出结果。

我们来看一下变量值的变化:

没有进行完整循环操作,没有对sum进行sum=sum+n操作之前,sum值为0, sum=sum+n操作之后的sum值要在执行下一条语句的时候这里的变量值窗口中才能显示出来

sum为0,说明我们第一次执行第8行这条语句的时候,程序就中止了,n的值此时为1,没有问题。

051 01 Android 零基础入门  01 Java基础语法 05 Java流程控制之循环结构 13 Eclipse下程序调试——debug入门1

按一下快捷键F6,进行单步调试:单步调试完成后,我们发现程序执行位置到了第7行,sum的值变为了1。

051 01 Android 零基础入门  01 Java基础语法 05 Java流程控制之循环结构 13 Eclipse下程序调试——debug入门1

小箭头指向第7行,表示第7行在执行(循环已经执行到了下一次)。那这时sum的值变为1了,因为经过了一次sum=sum+n (即:0+1)的运算。

051 01 Android 零基础入门  01 Java基础语法 05 Java流程控制之循环结构 13 Eclipse下程序调试——debug入门1

再按一下快捷键F6,进行单步调试:

这时候相当于把第7行执行完了,第7行执行了n++,所以n由1自增到2。而sum在第7行中没有执行变化,所以sum的值还是1。

051 01 Android 零基础入门  01 Java基础语法 05 Java流程控制之循环结构 13 Eclipse下程序调试——debug入门1

再按一下快捷键F6,进行单步调试:

这时候相当于把第8行再次执行完了,第8行再次执行了sum=sum+n (即:1+2)的运算,所以sum变为3。

所以我们发现,每个变量每次变量值的变化是在它执行完相应行的语句之后才发生改变的。

051 01 Android 零基础入门  01 Java基础语法 05 Java流程控制之循环结构 13 Eclipse下程序调试——debug入门1

多次按快捷键F6,进行多次单步调试: 直到n=5,并同时计算好了sum的值,sum=15。

051 01 Android 零基础入门  01 Java基础语法 05 Java流程控制之循环结构 13 Eclipse下程序调试——debug入门1

这之后,再最后按一下快捷键F6,进行单步调试:

我们观察,发现变量n在变量视图中消失了,为什么?

因为当n大于5的时候,就不满足循环条件了,n就退出了。

051 01 Android 零基础入门  01 Java基础语法 05 Java流程控制之循环结构 13 Eclipse下程序调试——debug入门1

这时候,sum=15。但是console控制台依然没有输出结果,因为我们的输出语句还没有执行到。

051 01 Android 零基础入门  01 Java基础语法 05 Java流程控制之循环结构 13 Eclipse下程序调试——debug入门1

继续F6单步调试

执行了输出语句之后,console控制台输出了执行结果

051 01 Android 零基础入门  01 Java基础语法 05 Java流程控制之循环结构 13 Eclipse下程序调试——debug入门1

整个调试过程,都演示了。如果我们程序逻辑出问题的时候,我们可以这样通过debug调试,查看程序的单步执行结果,定位到程序逻辑错误或者缺陷的原因。

4、结束调试

停止调试,单击红色方框按钮

051 01 Android 零基础入门  01 Java基础语法 05 Java流程控制之循环结构 13 Eclipse下程序调试——debug入门1

那如何回到代码编写视图呢?

有2个视图,一个debug,一个Java ,我们点击Java,就可以切换回代码编辑视图了。

051 01 Android 零基础入门  01 Java基础语法 05 Java流程控制之循环结构 13 Eclipse下程序调试——debug入门1

051 01 Android 零基础入门  01 Java基础语法 05 Java流程控制之循环结构 13 Eclipse下程序调试——debug入门1

总结

简单的调试过程演示到此

1、首先设置断点

2、然后debug程序

3、再去观察输出结果

F6单步调试快捷键比较重要,它是用于一步一步执行程序。

上一篇:构建iOS稳定应用架构时方案选择的思考,主要涉及工程结构,数据流思想和代码规范


下一篇:修改radio、checkbox、select默认样式的方法