00:01
下面呢,嗯,在讲我们今天的知识之前啊,先讲一个非常重要的东西。啊,我们呢,分几次去讲,先讲一个最最基本的。呃,讲一下esbug调试,上一次不跟大家讲了一下异常怎么去看对吧。那真正的在项目开发中呢,你你看可能看不出来。先肯定尽量看,如果能看出来,那很快就解决了,对吧,那看不出来,这个时候就需要调试。好啦。来,我呢,在这里面我把我的eclipse启动起来。启动起来,我们看一下第八个调试呢,可能大家也见过啊,有些人只是没有用过而已啊。先说一下它的基本的一个作用。其实就是跟踪程序的运行的过程。
01:02
找出问题出现的地方。啊,更快的去把问题给解决,有问题就是我们平常说的什么。Bug。好,这是它的一一种用途,还有一种用途是大家进了公司以后,可能会遇到的,这公司里面那个你一上手那项目是给一个很大的一个项目。嗯,比如说有一个功能流程特别长。那你怎么样去看它经过了一个什么样流程呢?调试就是一个很好的方式。因为前面是不是说过了那个那个DB调试是不是可以看那个运行的过程呢。啊,你就可以通过bug调试来去梳理一下已有功能它的代码的运行逻辑流程。主要还是第一个方面的作用,其实第二个方面是大家去接触一个新的项目的时候。
02:00
有可能会遇到。你就可以利用debug去做这样一个事。要不然的话,那你就自己看了,那自己看,有的时候他你想啊,一个程序它从上往下跑的时候是一条线路,是一条线路吗。不是,他是不是有可能有很多个分支啊,那到底进入了哪个分支,你想想看,你看代码的时候,你能一定能看清楚吗。是不是有点难度啊?啊,而且真正运行的时候,它到底是进入。第一个流程,第二个流程还是第三个流程,它是根据数据来判断的。但是你在仅仅看代码。内测有数据吗?是没有啊,那是死的对不对?只有真正运行起来的时候,它才有数据,有了数据才会决定它是进度一还是进度二还是进度三。啊。来。
03:02
在这里面呢,我有一个简单的一个Java工程,大家看看啊,是一个Java工程,非常非常简单的Java工程。这个加热工程呢,有这样一个类。嗯,把这些去掉啊,这个类呢,大家看啊,非常简单,我们来读一下啊,先简单读一下,这是一个int类型的集合,往集合里面添加了1233个数字吧,接着我去调用了这样一个方法。能看到吧,这个方法里面呢,把R给移除了。现在我问一下大家,我出来以后,我是不是打印历史的呀,这个历史的集合里面还有谁?啊。对吧,我现在是把二给移除了呀。这不印刷吗?那为什么一一了一了二还有二呢,那我要要想移除二怎么办呢啊,我就想一除二。
04:10
啊。转换成什么样啊。啊,有人告诉我这么做了,反正他告诉我我就做呗,对吧,看一下啊。啊,先看一下吧。是123吗?他说老师你把这个去掉是吧,那我也满足你的欲望。很奇怪是吧?这个地方有两个方法,一个叫remove index,一个叫object。
05:06
那如果你传的是一个,传的是一个R。他就会调用了,实际上是谁,哪个方法,你得想。是吧,是不是把它看成下标了呀,那如果。他。啊,它里面要显示in object了,那你就得把它转成object呀。是这意思吧,啊这个啊是特别容易犯错误的。就你,你也可能心里知道,但是有的时候一不小心咔嚓一下就哭了。好,来啊,这个不是我们重点。假设我们有些人呢,对这个不太理解,对吧,总觉得啊,我在运行啊,你就自己把自己变傻一点啊,就觉得自己无法理解。为什么我删掉啊,就是删不掉了对不对。
06:02
这意思吧,啊,我明显我就是瑞二嘛。对不对,我脑子里面我也不会看源码,我也不会看,也不会看文档啊,啥也不看,就是很傻的啊。好,下面我们就要说了,一旦出了,你这又没抛异常对吧?一场也没抛,就是。跟我预期的结果不一样。那我就得看一下这个集合里面数据是怎么一个变化的,对不对。这意思吧,好了,来。嗯,现在就涉及到我们的操作了。如何进行debug调试?第一步我们要开启debug调试。怎么开了?第一步。叫设置断点。这个断点,一般的断点,我们现在做的断点都是在方法体里面的某一行去设置。
07:05
啊,怎么设置呢,非常简单,譬如说。啊,记住了啊,一定在方法体里面的某一行。至少据说你四百九第九号啊。很简单,就是在这个左侧的这个蓝领上面。去双击。看到了吧,啊,你也可以在这上面算计啊,可以没问题,你也可以怎么做呢,右键。点它,但我习惯了,你你你明显双击快嘛。对不对,好。这是说的第一步啊,做这样一个是。第二步。第八个运行,我们平常怎么运行。对吧,啊来看一下右键。现在这么做的,那这么运行,你即使有断点。它也就过去了,对不对。好了,来,右键。
08:01
第八个。Java application,好了,出现了这么一个框。能看到吧,这个框呢。是一个确定框,它我希望大家把这个勾上。不然的话呢,它会每次都提醒,这个是什么意思呢?当前我们是Java视窗。Java的一个视图啊,他问你要不要进入debug的视图。啊,这个看到了吧,第bug的视图组合跟这个完全不一样。那你肯定要啊,对不对。他都告诉你了,你你。你还不要,那就是你就不想干这个事了,对吧?好了,给他勾选有个什么好处。下次就别去提醒我了,对吧,哪一个yes。大家看,现在就进入了我们的debug的视图。
09:01
整个一半视图,你不要去进行四川的移动,你比如说把这个四川移到左边来,不要动,你最多怎么动呢?就是去上下移动。啊,上下移动是有可能的,有时候看到啊,重点看它的时候,我就会把它拉高一点,对吧,那重点看上面的时候呢,我就把上面拉高一点。好了。现在我们就进入了这样一个视图了吧。我们可以把整个视图呢分成四个部分。首先是上面的这一个。啊,下面左边右边和下面来。这四个事实上我们叫一个什么,大家看第一个最上面的这个一部分,我们叫它常用debug操作工具栏。好。下面一个叫线程堆栈视图。啊,这个我后面慢慢跟大家说。第三个。来看一下,叫变量视图和断点视图都有这里面。
10:05
还有是break point就是断点嘛。变量。第三个,第四个是代码视图。哎,当前大家看着啊。我们的应用执行完了吗?没有,它有一个概念叫悬停。啊,悬停什么意思呢?就是挂在这个第九行了,知道吧,第九行运行了吗。没有运行。对吧。你通过来看到下面我们就看,先别调啊,先别动,我们来一个一个看。在这个里面最最关键的是它。是吧?主题对它进行操作啊,在说它之前,我们先把这里面的试穿给大家介绍一下,这个试穿没什么好介绍的。
11:01
主要是大家知道。你看当前那一行是不是深色的?这个非常关键,因为我得知道到底运行到了哪一行了。对吧,好这一个。四川我们叫它线程对战实战,大家看当前我们运行的是哪个线程。是先生呢?Main线程的哪个类呢?哪个类是不是deb才11哪个方法main方法执行到了它的第几行。第九行。它会把整个方法的调用的一个过程都给显示出来。啊,我给大家先展示,很快的演示一下,我现在我的操作大家可以不用管,我快速的进入,快速的走,快速走大家看啊,我进去大家看到。现在他是不是列出来,我当前是在第几行。18行哪个方法是历史的方法?
12:03
这个斑马之前经过了哪个帮忙?是main方法过来的呀,哎,我现在是不是只有两个方法层级在调用啊。那如果他经过的方法特别多,是不是后面还有很多呀。对吧。啊,那你就可以把整个流程都看得特别清楚。对不对。啊,我们当前是18,哎,你也可以点过去啊。你看我就知道这个方法是在哪一行掉的,在哪个方法里面掉的,是不是看得很清楚。对不对。好啦,这里说的是这一个试装啊。我们要不断的看着我们执行到哪一行去了啊,下面。这边变量。变量的这个非常的关键。大家看它的关键是它里面显示些什么呢?
13:02
它组变量嘛,那就显示一些变量,我们在调试的过程中一定要观察的这个变量的变化,大家看啊,它显示的是当前方法的。站里面要。的一些变量的值,譬如说我们当前这一个方法运行哪个方法呢?Update啊,它里面有什么变量啊。什么历史的呀?对不对,好历是一个什么值呢?当前我得可以看一下,大家看啊。选中它。是吧,而且我这个历史现在生明的是不是历是不是历史的呀,接口类型吧,但真实的什么类型。呀好,现在我里面是不是123呐,其实这个打印的是Miss to string方法。显示了它的to string。啊,看到这里啊,历史的内部是个什么结构都看的特别清楚。
14:04
你来看它实际上这是一个什么结构啊。几个圆几个空啊,还有几个洞里面十个洞对吧,那十个洞里面大家看呢,是个什么情况呢?有这样的一个情况。通过这八个调试,可以把某一个数据结构看的特别特别清楚。就你就现在就知道了,怎么做的对不对,它里面是个什么结构,我们放的东西是不是一个一个放啊。其他的里面都什么。No。并没有负值吧哈,对吧,并没有给他一个正常的值。啊,现在它的size子是不是三了。啊33,因为我们就放了三个嘛。其实这个里面都可以看得特别清楚,就看音解类型的,嗯。这不一个一个的。对吧,你要往里面看都可以啊,这是它的音节,是不是有一个属性叫value啊。
15:04
它的值。看的很清楚啊,平常的时候我们经常会有啊,有些数据结构特别的复杂,我们可能要需要把它打开,往里面深层这里去看。好。这是这一个啊,大家来看啊好。下面呢?嗯,这两个都给大家介绍一个,还一个简单说一下叫断点。啊,断点是什么意思啊,就是能显示我当前应用里面有几个断点,好吧,我这就一个啊,没有没有很好的说明,来我再加一个,譬如说我在这里面加个断点。大概现在几个道理了,两个,而且是哪个类里面哪个方法是不是很清楚啊,哪一行都标识的很特别特别清楚。嗯。啊,来看到这里面有几个操作,首先这两个应该是比较懂的。
16:01
干嘛?是不是把大姐给移除啊?啊,没问题。这个里面有一个非常重要的一个按钮啊,平常呢,我不告诉他。这个非常有意思,来我给它运行一下。啊,你可以在这运行。啊看啊啊有的时候吧,就是什么意思呢。啊,这个是主要现在的场景不太合适,有的时候我在开始运行的时候有断点,这个断点吧,我开始不想啊,不想有断点,我想后面才有断点啊,后面才经过这个断点啊,可能这个方法啊,开始运行的时候,启动的时候会执行一次。对吧,当我进行某一个操作以后呢,它又执行一次。能理解吧,啊有两次执行,但是我把先把前面的执行呢,我想过滤掉,就启动的时候不要进入这个调试状态,让它过去,等到我操作的时候再进来。可以做大家看啊,可以怎么做呢,可以是这样的,它这里面呢有一个按钮。
17:05
什么意思,跳过实际上就是你把它按下去以后吧,它这个断点就失效了。临时事项知道吧,他跟那个移除是不一样的。衣橱还有吗?他就把它移掉了,就啥用都没有了,懂意思吧,啊就相当于你看我给了大家演示一下果yes,还有大连吗。没了对不对,你再第八个运行能进入第八个的状态吗。那。是不是直接就运行完了呀,那没什么了。但是啊,如果是大家看到我可以做一下啊。啊,现在好像就是这样的。你看它这也有斜杠,你看着啊,现在我去运行一下。是不是过去了?但是我把这个一放开。
18:00
是不又有用了呀?这个经常用于什么呢?就是在在应用启动的时候啊,我某一个断点我不想进去,对吧,断点我不想进去,当我操作以后。再进去。对不对啊,这个经常会有用到啊,大家先关注一下。好。下面的重点是说他。对吧,这个里面都是些什么呢?来先简单的看这个图给大家看一下。先简单的把这个说明一下来啊。嗯嗯嗯,这里来把它放大一点打开。先简单说明啊,能听懂就听懂,不能听懂就等会看我操作。这个地方第一个是我们首先得说我们这个这个是不是有多个断点呢?假设我两个断点是吧,我这一个断点呢,控制了几行代码啊,这个端点又控制了几行代码,有的时候吧。
19:04
我进入这个端游,发现这里面代码呢,啊,没有错误。第二个点才有错误。我难道还一行一行的执行吗?不会直接跳到什么。下一个断点就是代表执行完端前断点去进入下一个断点,哎,为什么有可能结束啊。下面没断点的嘛,那不就结束了吗?对吧,好,这个大家应该可以懂,非常简单中断程序。直接把它刮了啊。好,下面3453呢,是进入当前这一行的方法去执行。好,在说三之前,我们可以先说一下四,四是干嘛?四是用的最多最多的。很简单,就是譬如说这是这是几行代码,12345,这是四行代码,当前呢,啊已经运行到这来了。对吧,好,我经常用做的事就是用四,四是干嘛呢?执行完单行进入什么下一行就一行一行的执行。
20:08
能明白吧。嗯。那如果当前这一行是调用一个方法,哎,我有时候我是不是想看方法里面怎么执行呢,怎么做呢。是不按三呢,按三好了,按三以后就有可能涉及到按五。有进去必然有什么出来对吧,那有的时候我进去了看到诶没问题是吧,没问题以后发现下面还有很多代码。我总不能一行一行的去执行吧。我就说什么。是不是跳出啊。常就这样的一个事啊,我们平常经常常用的就是这几个,好我们给大家。让大家体验一下啊。来。当前呢,是在第十行。第十行的时候,我们现在啊,看到我先用一下它,大家可以啊,还说一下。
21:03
看他,一定要看着他。看到现在X你有数据吗?没有,是个空数组对不对,好密的,我们来看一下。你里面现在有数据吗。Size为什么为零?哎,这很清楚啊,对不对。好,下面我们就来去观察这个历史的变化。来,下一步。看看。是不是多了一个数据?嗯,啊,来看它实际上是内部真实的结构,是不是是这样一个结构啊,那它做了一个封装啊,你看到的就是一啊size呢是一没问题,接着继续往下走。大概。是不是有变化呀。看得一清二楚。啊,非常的直观好。下面这个时候我想进去一下看看。对吧,音乐。是不是Q啊。啊,进去了吧,嗯,进去了以后,你看这个是不是有变化呀。
22:02
诶,为什么会变呢?刚才说过了,这一个变量,这一个区域显示的是当前方法的局部变量。能懂吗?啊,那你刚才是不是在命运方法里面。它的参数跟我的这个一样吗?跟我的这个逐变量是不一样的吧,不一样。啊,你也可以看一下历史的对不对,是不是我们刚才创建的呀。好。下面啊,下面就看一下它走。大家看你现在就看到了哦,原来是把谁删掉了。是不是把三删掉了呀。啊,我这个地方啊,是下面为二的对不对。啊,那我就是不是要去狠狠的去看他是怎么做的呀。对不对,好来在这里面呢,有一个是啊,这里面再执行就出去了吧。我再点下一步的话就出去了,嗯。
23:03
嗯,再者呢,就就有一个打印输出了啊。大概。对吧,嗯,好啦。来看着啊,我这么做,我再做一下,我在这里面呢,写一个随便写一个啊。再写一个协调语句,把另外一个呢给大家用一下就拉倒,嗯,在这个时候我想中断怎么办?是不是点开啊,嗯,还有几个没用,我给他再用一次。啊,每一个都给大家用一下,譬如说假设啊,我现在有几个单点大家看。两个是吧,我现在就怀疑二有问题,一没有问题怎么办?是不是点他呀。啊。过来了吧,嗯。等吧,下面来看到我走走走,我发现后面还有很多战法,我不想执行了,怎么办?是不是跳出啊,啊跳出跳出以后你看它是不是出去了,已经出来了吧,不可能再进去了啊,一旦出来就是把剩下的方法都执行完。
24:09
就出来了。好,最后有一个刚才说过了,把它可以进行一个中断的处理,是吧,你看啊,中断处理会打印,这个会不会打印。看着啊。我把现在把这个删掉啊清掉。中断。打印了吗?是没有啊,是不是直接把它挺起来了吧?嗯,没有啊。这几个简单的操作大意先会一下啊,我现在呢,只是说了一些基本的。因为今天呢,我们还没有去说Android里面的一些调试,其实跟这个差不多,但是呢,还没说啊,下次再说。
我来说两句