Android App 启动时立即崩溃无法debug的解决方法

Posted CodingForAndroid

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android App 启动时立即崩溃无法debug的解决方法相关的知识,希望对你有一定的参考价值。

Debug 调试技巧

https://blog.csdn.net/fn_2015/article/details/51198107
Android Studio 你需要掌握的Debug调试技巧

方法一

android开发者选项里,选择调试应用的列表里选择要调试的应用,然后把后面的等待调试器开关打开即可。

方法二
我们可以首先通过adb shell am set-debug-app -w ,然后再启动进程,系统会弹出一个Dialog提醒Application正在Waiting For Debugger。实际上这个时候应用程序进程已经fork出来了,只不过是阻塞在ActivityThread.handleBindApplication()方法里面,它通过调用Debug.waitForDebugger();一直等待直到DDMS连接上。这个时候我们再用Eclipse/AndroidStudio attach上所在进程,即可Debug后续启动过程,如ClassLoader的创建,Application的初始化以及启动,Activity启动等。

有人说Android 的调试是最坑的,那我只能说是你不会用而已,我可以说Android Studio的调试是我见过最棒的。

下面会将debug模式和Attach模式的断点调试

好了开始写一个简单的调试程序,我们先来一个for循环

for (int i = 0; i < 10; i++) 
//获取当前i的值
    int selector = i;
    //打log查看当前i的值(此步多余,实际开发请忽略)
    Logger.e("for当前的i的值:" + i);
    //调用方法
    stepNext(i);

设置断点(点击红点位置添加或取消断点)

点击debug模式运行

查看调试面板

一、简单调试

  1. step over:一步步往下走

当前程序运行的位置,我们看到i的值已经在程序代码中展示出来了,黄色的代码处,这个是AS的功能,对于我们调试来讲,这简直是非常大的福利了。

点击单步调试按钮或按快捷键F8,看看效果。这里我们看到selector变量的值已经出来了selector:0,我们在看看黄色位置i的当前值是0。

这时我们继续F8,我们切换到logcat查看日志,我打印出的i的值是0,

我们在切回道Debugger面板,可以看到Variables显示面板中,有i的值是0,selector的值是0。以及我们可以看到Frames控制面板中可以显示出当前程序的位置在:onCreate():28,第28行。

  1. step into:看到方法往里走
    比如我们的for循环当中调用了一个stepNext(int i)方法,当我们走到这里想看看这个方法里面的运行过程的时候我们可以这样,当走到这个方法的时候我们可以按下F7,或者如下图的图标。

这时就走到了stepNext方法当中。

在这里打印了一个log,我们再按一下F8我们来看看Logcat, 这里我打印的log都是为了做教程用,调试我们就不用打log了直接看显示面板就OK了

  1. force step into :所有方法看完整
    这个是可以看到你所调用的所有方法的实现会让你跟着它走一遍,研究源码使用非常方便

  1. step out :有断点下一个,走完断点继续走
    这里如果我们的一个流程当中,包括调用的方法,如果有断点走到下一个断点,如果没有断点,而是在一个调用的方法当中,会跳出这个方法,继续走。

这里理解比较难,举个例子:

(上图)我现在程序位置在第一个断点位置(24行),我调用的stepNext方法中也有一个断点,此时我按下step out按钮会走到stepNext中的断点处(39行)我此时如果再按一下step out 会走到stepNext方法的调用出的下一个可执行代码(30行)

(上图)如果我现在程序位置在stepNext的方法中,如果我此时按下step out,会走到stepNext方法的调用出的下一个可执行代码(30行)

  1. run to Cursor :下个断点我们见
    这里的意思就是说,会很快执行到下一个断点的位置,而且可以静如任何调用的方法

二、高级调试

  1. 跨断点调试
    如果我们设置了多个断点,现在我们需要直接跳转到下一个断点,那么直接点击下图就可以了

2.观察变量
如果我们想观察1个或者几个变量的值的变化,如果我们在Variables显示面版中观察如果我这里有太多太多的自定义变量和系统变量了,那么就难观察了,我们可以做如下操作:
点击Watches,点击+号,然后输入变量的名称回车就OK了,而且会有历史记录哦

如果变量名比较长我们可以这样:
选择[Variables]中的变量名然后点击[右键],选择[Add to Watches],然后Watches面板中就有了

3.设置变量的值
在程序中有很多的条件语句和循环语句,调试也是比较耗时的,我们可以通过快速设置变量的值来加快调试速度,我们可以做如下操作:
选择[Variables]中的变量名然后点击[右键],选择[Set Value…]或者选择之后直接F2(如上图)(下图为Variables面板)

4.查看断点

点击之后我们可以看到所有的断点,以及位置代码,也可以设置一些属性

5.停止调试
要注意的是这里的[停止调试]不是让程序停止,而是跳过所有调试

到这里我们的Android Studio的断点调试和高级调试就完毕了。

Attach模式调试

等等!先别着急翻页,本期还有最后一个压轴的技术点要分享给大家。
想象一下下面的场景:你的APK如果已经运行在普通模式(非Debug)的情况下,你突然想Debug,而又不想重新运行浪费时间,该怎么办呢?
普通模式下想设置断点进行调试可不可以呢?
当然是可以的,不仅可以,这种方式已经渐渐替代了原先的方案,毕竟很方便,不是吗?那具体要怎么做呢?

一、先设置断点,再正常运行APK

二、点击Attach调试

或者像下面一样打开也是可以的

即运行Run->Attach debugger to Android process

attach process到指定进程,条件触发之后就可以直接进入调试模式。之后该怎么做不用我再说了吧?

如果你也热衷技术欢迎加群一起进步:230274309 。 一起分享,一起进步!少划水,多晒干货!!欢迎大家!!!(进群潜水者勿加)

点击链接加入群聊【编程之美】:https://jq.qq.com/?_wv=1027&k=h75BfFCg

+++++++++++++++++++++++
或者扫码
+++++++++++++++++++++++

以上是关于Android App 启动时立即崩溃无法debug的解决方法的主要内容,如果未能解决你的问题,请参考以下文章

Bootstrap 方法返回 null - Android 在启动时立即崩溃

膨胀类 android.support.v7.app.AlertController.RecycleListView 时出错

谁能解释一下为啥这个 android 布局不工作并且在活动启动后立即使活动崩溃

为啥 Kivy apk 在 android 设备上启动 apk 后立即崩溃

iOS 7 Only App在启动时崩溃

Android - 无法开始活动