AS 断点调试 debug模式

简介

此种调试方式是通过 冻结应用运行的状态,仿佛时间停止了一般,然后我们逐一 观察此时程序的各个参数是否符合我们的预期。
这种调试方法 适用于对时间不敏感的程序。也就是说被调试的程序线程不需要依赖别的线程,即使暂时停止工作也不会影响别的工作线程或者受别的工作线程影响。

在希望代码 暂停运行的地方打断点,在代码前点击一下,出现一个红色的圆点,如果想取消,再点击一次即可。
点击顶部工具栏图标  795730-20180106200525753-1115321907.png 开启调试模式
点击左侧行号 红点位置  795730-20180106200526003-609647156.png  添加或取消断点

Frame区域是程序的 方法调用栈区,这个区域中显示了 程序执行到断点处所调用过的所有方法,越下面的方法被调用的越早。
由此顺序可了解Android系统启动流程,也即是怎么一步步调用到Activity的onCreate方法的:
795730-20180106200526362-57695882.png

基本操作:常用工具栏

795730-20180106200526643-793681377.png
调试时的正确姿势是:
如果想一步步监测程序的运行过程,就一直点击【step over】
如果只想监测运行到某几行关键代码时的状态,就设置多个断点,然后一直点击【run to cursor】
如果想看看某个方法里面的运行过程,就点击一次【step into】或【force step into】
如果想跳出这个方法,就点击一次【step out】
 
1
如果想一步步监测程序的运行过程,就一直点击【step over
2
如果只想监测运行到某几行关键代码时的状态,就设置多个断点,然后一直点击【run to cursor
3
如果想看看某个方法里面的运行过程,就点击一次【step into】或【force step into
4
如果想跳出这个方法,就点击一次【step out

step over【一步步往下走】

程序向下执行一行,如果当前行有方法调用,这个 方法将被执行完毕返回,然后到下一行。
例如,当前程序走到了断点处:
795730-20180106200526924-1387353856.png
此时点击step over后:
795730-20180106200527112-1908757687.png
再点击 step over后:
795730-20180106200527315-1745628570.png
再点击 step over后(注意没有进入 stepNext 方法):
795730-20180106200527518-1358452683.png
再点击 step over后:
795730-20180106200527737-474319968.png

注意:如果 stepNext 方法中有断点,则点击step over后也会跳到 stepNext 方法中。

step into【看到方法往里走】

程序向下执行一行, 如果该行有自定义方法,则运行进入自定义方法(不会进入官方类库的方法)。
当前程序走到了断点处后点击step into后:
795730-20180106200527924-2006699241.png
再点击step into后(进入了 Log. 方法):
795730-20180106200529128-677459601.png
再点击step into后:
795730-20180106200529331-964603656.png
再点击step into后(进入了 stepNext 方法):
795730-20180106200529909-1005363083.png
再点击step into后(进入了 Toast.makeText 方法):
795730-20180106200530534-1332414438.png
卧槽,你要是在进入 Toast.makeText 方法后不赶紧点击 step out 返回,后续将有上百次调用等着你。

force step into【所有方法看完整】

能进入任何方法,这个 可以看到你所调用的所有方法的实现,研究源码使用非常方便,平时使用不到。

step out【下一个断点或跳出方法】

1、如果在调试的时候你进入了一个方法,并觉得该方法没有问题,你就可以使用 step out 跳出该方法, 返回到该方法被调用处的下一行语句; 注意该方法已执行完毕。
2、如果后面有断点则走到下一个断点;如果后面没有断点,而是在一个调用的方法当中,则会跳出这个方法,并继续走。

比如,如果你只想监测所有value的值,只需设置如下一个断点,然后一直点击 step out 即可
795730-20180106200532190-197825081.png
795730-20180106200532846-1410056351.png
795730-20180106200533128-1239599246.png

当执行完循环后再点击 step out,程序会跳出 test 方法。
795730-20180106200534393-1613190335.png

run to cursor【下一个断点】

和 step out 中的【下一个断点】功能相同,但是因为功能专一,所以不容易出现莫名其妙的跳转。

drop frame【回退到上一个调用的方法】

返回到当前方法的调用处重新执行,并且所有上下文变量的值也回到那个时候。
只要调用链中还有上级方法,可以跳到其中的任何一个方法。
所谓的Frame,其实对应的就是一次方法调用压栈的信息。

其他操作

795730-20180106200535221-1901243657.png
resume program:程序继续往下执行,直到遇到下一个断点(感觉和 run to cursor 没任何区别呀)
pause  program:程序暂停往下执行
stop app:停止调试,App会关闭,你再次打开时不再是调试模式

view breakpoints:查看所有设置的断点及其位置,也可以设置断点的一些属性
mute  breakpoints:暂时使所有断点失效
get thread dump:获取线程堆栈信息
restore layout:恢复调试版本为默认的布局

Variables 变量面板

1、直接 在代码中就可以看到代码执行到当前位置时各个变量的值
2、 在Variables面板中也能查看
795730-20180106200535549-2007129423.png
左边几个图标代表的功能分别是:添加、删除变量,上下移动变量的位置,复制(duplicate),将要观察的变量放在另一个tab栏,如下效果:
795730-20180106200536299-877995068.png
3、如果我们仅仅想观察指定几个变量的值的变化,可以点击Watches,点击+号,然后输入变量的名称回车就OK了。
如果变量名比较长我们可以选择Variables中的变量名然后右键,选择[Add to Watches],然后Watches面板中就有了
我们可以通过快速设置变量的值来加快调试速度,选择[Variables]中的变量名右键,选择[Set Value..]。
比如,我们在一次100次的for循环中,想观察第90次循环后的执行情况,就可以将循环次数手动改为90,这样就不用将循环控制变量从0点到90了。

附:测试代码

public class MainActivity extends AppCompatActivity {
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		test();
		Toast.makeText(this, "执行完毕", Toast.LENGTH_SHORT).show();
	}
	
	private void test() {
		int value;
		for (int i = 0; i < 10; i++) {
			value = new Random().nextInt(100);
			Log.i("bqt", "第" + i + "个随机数的值:" + value);
			stepNext(i);
		}
	}
	
	private void stepNext(int i) {
		Toast.makeText(this, "i = " + i, Toast.LENGTH_SHORT).show();
	}
}
23
23
 
1
public class MainActivity extends AppCompatActivity {
2
    
3
    @Override
4
    protected void onCreate(Bundle savedInstanceState) {
5
        super.onCreate(savedInstanceState);
6
        setContentView(R.layout.activity_main);
7
        test();
8
        Toast.makeText(this, "执行完毕", Toast.LENGTH_SHORT).show();
9
    }
10
    
11
    private void test() {
12
        int value;
13
        for (int i = 0; i < 10; i++) {
14
            value = new Random().nextInt(100);
15
            Log.i("bqt", "第" + i + "个随机数的值:" + value);
16
            stepNext(i);
17
        }
18
    }
19
    
20
    private void stepNext(int i) {
21
        Toast.makeText(this, "i = " + i, Toast.LENGTH_SHORT).show();
22
    }
23
}
2018-1-6




  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值