这篇写Android studio debug技巧我的以为写得不错,转自:http://www.jianshu.com/p/011eb88f4e0d#java
Android Studio目前已经成为开发Android的主要工具,用熟了可谓至关顺手。做为开发者,调试并发现bug,进而解决,但是咱们的看家本领。正所谓,工欲善其事必先利其器,和其余开发工具同样,如Eclipse、Idea,Android Studio也为咱们提供了强大的调试技巧,今天咱们就来看看Android Studio中有关调试的技巧。android
首先,来看看Android studio中为咱们提供的调试面板(标准状况下):express
点击右上角Restore ‘Threads’View可先展现目前相关的线程信息:多线程
android studio大致为咱们提供了7个功能区:并发
下面咱们分别对这七个区域进行介绍。app
该区提供了调试的主要操做,和你所熟知的同样的,主要有:Step over、step into、force step into、step out、drop frame。ide
点击该按钮,光标将定位到当前正在调试的位置.工具
单步跳过,点击该按钮将致使程序向下执行一行。若是当前行是一个方法调用,此行调用的方法被执行完毕后再到下一行。好比当前代码是:开发工具
int num=10; int min=Math.min(num,100); System.out.println(min);
若是当前调试的是第二行,当点击step over时,Math.min(num,100)方法先执行完后跳到第三行.this
单步跳入,执行该操做将致使程序向下执行一行。若是该行有自定义的方法,则进入该方法内部继续执行,须要注意若是是类库中的方法,则不会进入方法内部。
强制单步跳入,和step into功能相似,主要区别在于:若是当前行有任何方法,则无论该方法是咱们自行定义仍是类库提供的,都能跳入到方法内部继续执行
没有好记的名字,大意理解为中断执行,并返回到方法执行的初始点,在这个过程当中该方法对应的栈帧会从栈中移除.换言之,若是该方法是被调用的,则返回到当前方法被调用处,而且全部上下文变量的值也恢复到该方法未执行时的状态。简单的举例来讲明:
public class DebugDemo { private String name = "default"; public void alertName() { System.out.println(name); debug(); } public void debug() { this.name = "debug"; } public static void main(String[] args) { new DebugDemo().alertName(); } }
当你在调试debug()时,执行该操做,将回调到debug()被调用的地方,也就是alertName()方法。若是此时再继续执行drop frame,将回调到alertName()被调用的地方,也就是main().
很是好用的一个功能,能够忽视已经存在的断点,跳转到光标所在处.举个简单例子说明下:
好比如今第10行,此时我想调试18行而又不想一步一步调试,能不能一次到位呢?咱们只须要将光标定位到相应的位置,而后执行Force Run to Cursor便可:
点击该按钮会在当前调试的语句处嵌入一个交互式解释器,在该解释器中,你能够执行任何你想要执行的表达式进行求值操做。好比,咱们在调试时执行到如下代码:
此时执行Evaluate Expression,就至关于在调试行以前嵌入了一个交互式解释器,那么在该解释器中咱们能作什么呢?在这里,咱们能够对result进行求值操做:对着你想要求值得位置点击鼠标右键,选择evaluate Expression.此时会显示以下:
在弹出的输入框中输入求值表达式,好比这里咱们输入Math.min(result,50)
,以下图
点击执行,咱们发如今Result中已经输出告终果,以下:
点击该按钮会中止目前的应用,而且从新启动.换言之,就是你想要从新调试时,可使用该操做,嗯,就是从新来过的意思.
点击该按钮将暂停应用的执行.若是想要恢复则可使用下面提到的Resume Program.
该操做有恢复应用的含义,可是却有两种行为:
public void test(){ test1(); ... test2(); }
假设咱们分别在第2行和第4行添加了断点。若是此时咱们调试在第2行,此时点击执行该操做,当前调试位置会自动执行到第4行,也就是第2到第4行之间的代码会自动被执行。
点击该按钮会经过相关的关闭脚原本终止当前进程.换言之,对不一样类型的工程可能有不一样的中止行为,好比:对普通的Java项目,点击该按钮意味着退出调试模式,可是应用还会执行完成.而在Android项目中,点击该按钮,则意味这app结束运行.
这里咱们以一个普通的JAVA工程为例:
此时若是咱们执行中止操做,发现程序退出调试模式,并正常执行完毕,Console中结果以下:
点击该按钮会进入断点管理界面,在这里你能够查看全部断点,管理或者配置断点的行为,如:删除,修改属性信息等:
使用该按钮来切换断点的状态:启动或者禁用.在调试过程当中,你能够禁用暂时禁用全部的断点,已实现应用正常的运行.该功能很是有用,好比当你在调试过程当中,忽然不想让断点干扰你所关心的流程时,能够临时禁用断点.
获取线程Dump,点击该按钮将进入线程Dump界面:
借此咱们顺便介绍一下dump界面:
线程工具区中最经常使用的是
,能够用来过滤线程,其余的不作解释了
解析来咱们来认识一下线程的类型,表示为不一样的图标:
线程状态描述 | 图标 |
---|---|
Thread is suspended. |
![]()
这里写图片描述
|
Thread is waiting on a monitor lock. |
![]()
这里写图片描述
|
Thread is running. |
![]()
这里写图片描述
|
Thread is executing network operation, and is waiting for data to be passed. |
![]()
这里写图片描述
|
Thread is idle. |
![]()
这里写图片描述
|
Event Dispatch Thread that is busy. |
![]()
这里写图片描述
|
Thread is executing disk operation. |
![]()
这里写图片描述
|
点击该按钮将打开有关设置的列表:
咱们对其中的几个进行说明:
调试过程当中开启该功能,将会代码右边显示变量值,即下图中红框所示部分:
调试过程当中启用该功能,将在变量区显示最后执行方法的返回值.举个例子来讲,首先,关闭该功能,咱们调试这段代码并观察其变量区:
开启该功能以后,再来观察变量区的变化:
继续往下调试:
继续往下调试:
这个功能简直是棒极了,在调试一段代码,并想看该代码中最后调用方法的最终结果时就很是有用了.
开启这个功能后,idea的Debugger会自动评估某些变量,大概就是当你执行在某个断点时,Debugger会检测当前调试点以前或者以后的变量的状态,而后在变量区选择性输出.举个例子来讲明,未开启该功能以前,变量区输出全部的变量信息:
开启以后,当你调试到第13行时,Debugger检测到num变量在以后没有被使用,那么在变量区就不会输出该变量的信息.
开启这个功能的化,变量区中的输出内容会按照按字母顺序进行排序,很简单,不经常使用,仍是按照默认的顺序好.
这个不用说了,有任何不明白的均可以查看官方帮助文档,这是我见到最好的文档之一.
其余几个操做:Settings,Pin,Close留给各位本身去使用.
在调试过程当中,咱们能够方便的修改某个变量的值,以下:
在上图中,当前result的值通过计算为10,这里咱们经过Set Value将其计算结果修改成100.
该区域将显示你所感兴趣的变量的值。在调试模式下,你能够经过Add to Watches将某个变量添加到观察区,该值的变化将会在变量观察区显示。操做以下:
这里咱们对name比较感兴趣,但愿看到它的值的变化状况,所以咱们将其“特殊关照”。须要注意,此时由于name是成员变量,所以在对象观察区也可看到该值。若是是局部变量,无疑只能用这种方式了。
到目前为止,咱们已经简单的介绍了调试功能区,断点管理区,求值表达式,这三个区域的功能。在上面,咱们不断的提到了断点一次,可是断点是什么呢?想必大部分人已经知道了,咱们这里在简单的说明下:
断点是调试器的功能之一,可让程序暂停在须要的地方,帮助咱们进行分析程序的运行过程。
在Android Studio中,断点又被如下五类:
其中方法断点是咱们最熟悉的断点类型,相信没有人不会。下面咱们着重介绍其余四种类型的断点。
所谓的条件断点就是在特定条件发生的断点,也就是,咱们可将某个断点设置为只对某种事件感兴趣,最典型的应用就是在列表循环中,咱们但愿在某特定的元素出现时暂停程序运行。好比,如今咱们有个list中,其中包含了q,1q,2q,3q四个元素,咱们但愿在遍历到2q时暂停程序运行,那么须要进行以下操做:
在须要的地方添加断点,以下:
断点处左键单击,在Condition处填写过滤条件.此处咱们只关心2q,所以填写s.equals("2q")
该类型的断点不会使程序停下来,而是在输出咱们要它输出的日志信息,而后继续执行。具体操做以下:
一样在断点处左键单击,在弹出的对话框中取消选中Suspend。
在弹出的控制面板中,选中Log evaluated expression,而后再填写想要输出的日志信息,以下:
当调试过程遇到该断点将会输出结果,以下:
所谓的异常断点就是在调试过程当中,一旦发生异常(能够指定某类异常),则会马上定位到异常抛出的地方。好比在调试异常中,咱们很是关注运行时异常,但愿在产生任何运行异常时及时定位,那么此时就能够利用该类型异常,在上线以前,进行异常断点调试很是有利于减小正式环境中发生crash的概率。
具体操做以下:在Run菜单项中,选择View Breakpoints(也能够在断点管理面板中点击
),以下:
在管理断点面板中,点击+
在弹出的下拉选择列表中,咱们选择Java Exception Breakpoints
这里咱们选中Search By Name,在下面的输入框中输入咱们所关心的异常类型。此处咱们关心NullPointerException,在调试过程一旦发生NullPointerException,调试器就会定位到异常发生处。
(略过吧,应该没人不知道了)
Filed WatchPoint是本质上是一种特殊的断点,也称为属性断点:当咱们某个字段值被修改的时候,程序暂停在修改处。一般在调试多线程时尤其可用,能帮咱们及时的定位并发错误的问题。其使用和添加普通的断点并没有不一样,断点图标稍有不一样
到目前,调试的相关基础咱们已经介绍完了,可是很多童鞋对Android Studio中
这两个按钮感到困惑:Debug和Attach process。
这里咱们就简单介绍一下这二者的区别:
在具体调试过程,自行酌情选择便可。后面,我会带你们一步一步调试Android的Framework相关的源码,参见:
本身动手编译最新Android源码及SDK及本身动手调试Android源码