Android Studio调试其实也很是方便,通常问题直接经过AS的DDMS的Logcat就能够搞定。AS支持相似Eclipse的DDMS的全部功能。这里要说的是疑难问题的调试方式,即断点调试。html
首先先编译好要调试的程序。java
如上图2所示在行号处点击设置断点。而后如1所示点击开启调试会话。多线程
如上图所示,IDE下方出现Debug视图,1指向的是如今调试程序停留的代码行,2区域是程序的方法调用栈区。在这个区域中显示了程序执行到断点处所调用过的所用方法,越下面的方法被调用的越早。由此顺序想必有些Android深刻功底了解一点Android系统启动流程的就知道这几个方法咋回事,怎么到Activity的onCreate的。哈哈,说到系统了。不扯了。3是一些调试按钮,快捷键放在上面直接会显示。4和5是一些变量观察区。并发
上图中:eclipse
点击1指向的按钮,程序向下执行一行,若是当前行有方法调用,这个方法将被执行完毕返回,而后到下一行。函数
点击2指向的按钮,程序向下执行一行。若是该行有自定义方法,则运行进入自定义方法(不会进入官方类库的方法)。高并发
点击3钮在调试的时候能进入任何方法。工具
点击4的做用是若是在调试的时候你进入了一个方法(如debugFunc),并以为该方法没有问题,你就可使用4跳出该方法,返回到该方法被调用处的下一行语句。值得注意的是,该方法已执行完毕。ui
点击5指向的按钮后,你将返回到当前方法的调用处从新执行,而且全部上下文变量的值也回到那个时候。只要调用链中还有上级方法,能够跳到其中的任何一个方法。lua
如上图设置多个断点,开启调试。想跨断点移动到下一个断点,点击以下图1箭头,程序将运行一个断点到下一个断点之间须要执行的代码。若是后面代码没有断点,再次点击该按钮将会执行完程序。点击箭头2指向的按钮,能够查看你曾经设置过的断点并可设置断点的一些属性,以下图所示。调试开始后,在Variables区域能够给指定的变量赋值(鼠标左键选择变量,右键弹出菜单选择setValue…)。这个功能能够更加快速的检测你的条件语句和循环语句。点击箭头3加号或者在调试的代码变量上右键添加watcher便可查看跟踪变量值。
上图箭头1指向的是你曾经设置过的断点,箭头2能够设置条件断点(知足某个条件的时候,暂停程序的执行,如 index==5)。结束调试后,应该在箭头1处把所设的断点删除(选择要删除的断点后,点击上方的红色减号)。
以上即是AS的一些调试使用技巧。
转载自:http://www.cnblogs.com/firstcsharp/p/4333264.html
先编译好要调试的程序。
选定要设置断点的代码行,在行号的区域后面单击鼠标左键便可。
点击红色箭头指向的小虫子,开始进入调试。
IDE下方出现Debug视图,红色的箭头指向的是如今调试程序停留的代码行,方法f2()中,程序的第11行。红色箭头悬停的区域是程序的方法调用栈区。在这个区域中显示了程序执行到断点处所调用过的所用方法,越下面的方法被调用的越早。
点击红色箭头指向的按钮,程序向下执行一行(若是当前行有方法调用,这个方法将被执行完毕返回,而后到下一行)
点击红色箭头指向的按钮,程序向下执行一行。若是该行有自定义方法,则运行进入自定义方法(不会进入官方类库的方法)。具体步骤以下:
在自定义方法发f1()处设置断点,执行调试
点击
该按钮在调试的时候能进入任何方法。
若是在调试的时候你进入了一个方法(如f2()),并以为该方法没有问题,你就可使用stepout跳出该方法,返回到该方法被调用处的下一行语句。值得注意的是,该方法已执行完毕。
点击该按钮后,你将返回到当前方法的调用处(如上图,程序会回到main()中)从新执行,而且全部上下文变量的值也回到那个时候。只要调用链中还有上级方法,能够跳到其中的任何一个方法。
设置多个断点,开启调试。
想移动到下一个断点,点击以下图:
程序将运行一个断点到下一个断点之间须要执行的代码。若是后面代码没有断点,再次点击该按钮将会执行完程序。
点击箭头指向的按钮,能够查看你曾经设置过的断点并可设置断点的一些属性。
箭头1指向的是你曾经设置过的断点,箭头2能够设置条件断点(知足某个条件的时候,暂停程序的执行,如 c==97)。结束调试后,应该在箭头1处把所设的断点删除(选择要删除的断点后,点击上方的红色减号)。
调试开始后,在红箭头指向的区域能够给指定的变量赋值(鼠标左键选择变量,右键弹出菜单选择setValue...)。这个功能能够更加快速的检测你的条件语句和循环语句。
alt+f8 debug时选中查看值
f8至关于eclipse的f6跳到下一步
shift+f8至关于eclipse的f8跳到下一个断点,也至关于eclipse的f7跳出函数
f7至关于eclipse的f5就是进入到代码
alt+shift+f7这个是强制进入代码
ctrl+shift+f9 debug运行java类
ctrl+shift+f10正常运行java类
command+f2中止运行
这个功能很是实用,能够在断点处直接进入一个求值环境,在这里你能够执行任何你感兴趣的表达式;以下图:
好比在断点处有一个对象 object
,若是你要查看它的某个属性很简单,在Debug窗口就能看到,可是若是你想要执行它的某个方法看看结果是什么呢?借助这个能够实现。固然它的功能远不止这么多,至关于直接进入了一个 REPL
环境,很是实用。忘了说了,快捷键 Alt + F8
:P
假设你的断点在一个列表的循环里面,但是你只对这个列表的某一个元素感兴趣,只想在遇到这个元素的时候才断下来;你是一直人肉 F9
直到知足条件吗?条件断点就是知足这种需求的,顾名思义,在特定条件下的断点。使用起来也很是简单,在你的断点上鼠标有件会出现一个小窗口,写上条件便可。
不少时候咱们调试的时候更多的是打印日志定位异常代码,缩小范围以后再使用断点解决问题;因此常常作的事情就是在代码里面添加日志信息,输出函数参数,返回信息,输出咱们感兴趣的变量信息等。
可是这么作一个问题就是,咱们添加了日志代码须要从新编译;在没有 Instant Run
以前的黑暗时代这么作是很是痛苦的,每次编译少则几十秒,多则几分钟;这样无心义的等待简直就是折磨;其实,除了热部署工具,咱们还可使用日志断点解决这个问题。
首先咱们在想要输出信息的地方下一个断点;而后右键这个断点,在出现的设置框里面把这个断点的 suspend
属性设置为 False
,这样虽然叫作“断点”,可是并不会真正断下来;而后,咱们在 log message
里面填上咱们想要输出的日志信息。以下图(注意标红位置):
这样,每次代码执行到这个断点的位置,这个可爱的断点并不会使咱们的程序停下来,而是输出咱们告诉它的日志信息,而后继续执行;很是方便。
传统的调试方式是以行为单位的,所谓单步调试;可是不少时候咱们关心的是某个函数的参数,返回值;(回想一下咱们使用日志的时候打印的最多的信息难道不是函数的参数和返回值吗?)使用方法断点,咱们能够在函数级别进行调试;若是常常跳进跳出函数或者只对某个函数的参数感兴趣,这种类型的断点很是实用。具体使用方法有两种方式;最简单的是在你感兴趣的方法头那一行打上断点,这时候你会发现断点图标有点不同,这就是方法断点了,以下图:
另一种方式是经过 断点设置窗口 , 后面介绍。
在有些状况下,咱们只对某些特定的异常感兴趣,或者咱们只对异常感兴趣;咱们但愿只要程序发生异常程序就能断下来;这好像保存现场同样,只要发生命案了(异常),第一时间保存现场,这样什么指纹之类的线索就会清晰不少,坏蛋就算想逃也是插翅难飞啊。
Android Studio给了咱们这个能力!那就是 异常断点 !能够在特定异常发生的时候,直接让整个程序断下来;若是你对全部异常感兴趣,直接 Throwable
便可。
具体作法是,进入 Run -> View BreakPoints
或者使用快捷键打开断点设置窗口;以下图:
点击左上角的 :heavy_plus_sign: ,会出现一个选择框;选择 Exception Breakpoint
;而后会出现一个对话框,选择你感兴趣的异常:
在上面咱们添加异常断点的时候,点击加号的时候,有四个选项;第一个就是咱们前面所说的第二种方法断点的添加方式,第三个是异常断点,那么第二个 Field WatchPoint 是干什么的呢?
有没有这样一种场景:你发现某个值莫名其妙滴不知道何时被谁给修改了,罪魁祸首是谁?Java虽然是值传递,可是引用也能够是值;对象所有存放在堆上面,而堆是被全部线程共享的,所以在很是复杂的场景下,你根本不知道这些共享变量被谁修改了,这样很是危险;在多线程环境下,不变性是一个很重要的特性,咱们看到高并发的语言诸如 Erlang
, Scala
对于这种不变性都有着某种程度的支持。
好吧,扯远了;那么咱们怎么揪出这个修改咱们值的捣蛋鬼呢?那就是这个 Field WatchPoint 的功能了;使用它咱们能够在某个 Field 被访问或者修改的时候让程序断下来;完美解决这个问题。
下断点的方式和方法断点相似,也有两种;第一种是直接在某个字段的声明处下断点,这时候断点图标会改变,以下图:
右键这个断点咱们能够进行一些设置,好比默认是被修改的时候断下来,你也能够改成每次访问这个字段就断下来。
另一种方式是 Run -> View BreakPoint
打开设置,与异常断点相似。
上面介绍了这么多给力的功能,其实还有不少细节;打开断点设置窗口(Run -> View Breakpoint`):