Android Studio五分钟带你从菜鸟到高级调试 - Go语言中文社区

Android Studio五分钟带你从菜鸟到高级调试


 

本文已授权微信公众号:鸿洋(hongyangAndroid)在微信公众号平台原创首发。

 

前段时间刚刚入职,还算比较幸运。进来就是让我做Android的。好多同学都去做其他没有接触过的东西了。刚开始一周肯定就是熟悉代码。但是我刚拿到代码我就呆了。做的是一个金融业务的APP。由于好多数据要加密所以,公司自己采用TCP层链接,用SSL加密协议。自己封装的网络框架和网络请求 。其中令我最头疼的就是网络请求的发包和回包以及回包数据的处理。在这个熟悉代码的过程中最主要的就是调试。以前从没用过Android studio 的调试。下面就来简单介绍一下Android studio的调试。

我们先来看看AS的调试面板:

点击右上角Restore ‘Threads’View可先展示目前相关的线程信息:

AS的调试主要分为6个功能区:

1、断点调试功能区

2、断点管理功能区

3、求值表达式

4、线程帧栈区

5、对象变量区

6、变量观察区

 

下面我们一个一个来介绍:

1、断点调试功能区:

这个区主要由上面这几个按钮:Step over、step into、force step into、step out、drop frame。

1.1:Step over

单步执行按钮,点击这个按钮,程序向下执行下一步,如果下一步是方法,那么执行到这一步时这步多调用的方法已经执行完毕。

例如:

int num = 10;

int nu = MAX(num,100);

若现在在第一行,当执行Step over时,会执行完MAX这个方法里面所有的步骤。

1.2:step into

单步跳入按钮,点击该按钮,程序向下执行一步,如果下一步是方法,那么跳入到该方法的第一步。

如上面的点击step into则跳入MAX方法的第一步。

1.3 force step into

强制单步跳入,和step into功能类似,主要区别在于:如果下一行是一个方法,则不管该方法是我们自行定义还是类库提供的,都能跳入到方法内部继续执行。

1.4 step out

单步跳出按钮,和step into 功能相反。主要作用是:跳出当前执行的方法或循环。

例如:上面点击step into跳入MAX方法里面。点击该按钮则跳出MAX方法并且执行完该方法。

1.5 drop frame

没有好记的名字,大意理解为扔掉当前栈帧,即停止当前方法的执行,返回到当前方法被调用处,并且所有上下文变量的值也恢复到那个时候。简单的举例来说明:

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().

2、断点管理功能区

2.1 执行至下一断点:

点击该按钮,程序执行至下一断点出。
 

在很多情况下,我们会设置多个断点以便调试。在某些情况下,我们需要从当前断点移动到下一个断点处,两个断点之间的代码自动被执行,这样我们就不需要一步一步调试到下一个断点了,省时又省力。

2.2 断点管理

该按钮的主要功能是对所有断点进行管理(增加、删除)。点击该按钮我们可以看到如下所示的窗口:

2.3 停止调试

这个按钮的功能顾名思义就是停止调试,推出调试模式,这里就不再多做说明了。

3、求值表达式
即Evaluate expression,当执行该操作时,会在当前调试的语句处嵌入一个交互式解释器,在该解释器中,你可以执行任何你想要执行的表达式进行求值操作。比如,我们在调试时执行到以下代码:

此时执行Evaluate Expression,就相当于在调试行之前嵌入了一个交互式解释器,那么在该解释器中我们能做什么呢?在这里,我们可以对result进行求值操作:对着你想要求值得位置点击鼠标右键,选择evaluate Expression.此时会显示如下:

 

 

在弹出的输入框中输入求值表达式,比如这里我们输入Math.min(result,50),如下图所示:

点击执行,我们发现在Result中已经输出了结果,如下:

4、修改变量值

在调试过程中,我们可以方便的修改某个变量的值,如下:

在上图中,当前result的值经过计算为10,这里我们通过Set Value将其计算结果修改为100.

5、变量观察区

该区域将显示你所感兴趣的变量的值。在调试模式下,你可以通过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

   

 

 

Filed WatchPoint是本质上是一种特殊的断点,也称为属性断点:当我们某个字段值被修改的时候,程序暂停在修改处。通常在调试多线程时尤为可用,能帮我们及时的定位并发错误的问题。其使用和添加普通的断点并无不同,断点图标稍有不同调试的两种方式。
到目前,调试的相关基础我们已经介绍完了,但是不少童鞋对Android Studio中

 

 

 

 

 

这两个按钮感到困惑:Debug和Attach process。 这里我们就简单介绍一下这两者的区别:
Debug:以调试模式安装运行,断点可以在运行之前设置,也可在运行后设置,是多数人最常用的调式方式
Attach process:和Debug方式相比,能够将调试器attach到任何正在运行的进程。比如,我们可以通过attach process到想要调试的进程。然后,在需要的地方设置相关断点即可。

 

 

其他文章
1、Gradle
[一分钟帮你提升Android studio 编译速度](https://bthvi-leiqi.blog.csdn.net/article/details/51918534)
2、Flutter
[Flutter从入门到实战](https://bthvi-leiqi.blog.csdn.net/article/details/80474494)
3、源码
[深入理解HashMap原理(一)——HashMap源码解析(JDK 1.8)](https://bthvi-leiqi.blog.csdn.net/article/details/89181005)
[深入理解HashMap原理(二)——手写HashMap](https://bthvi-leiqi.blog.csdn.net/article/details/89354198)
4、热修复
 [Android学习——手把手教你实现Android热修复](https://bthvi-leiqi.blog.csdn.net/article/details/80954639)
 [Android热修复——深入剖析AndFix热修复及自己动手实现](https://bthvi-leiqi.blog.csdn.net/article/details/96644721)
 [手撸一款Android屏幕适配SDK](https://bthvi-leiqi.blog.csdn.net/article/details/95076522)

 

 

 

版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/u013132758/article/details/51915575
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2020-06-27 23:01:13
  • 阅读 ( 903 )
  • 分类:

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢