androidstudio调试js怎么调试

第1章 课程导学
第2章 各种配置及快捷键
第3章 总结
Copyright (C)
All Rights Reserved | 京ICP备 号-2AndroidStudio应用调试技巧(上)
安卓开发的过程中,需要对开发的程序进行调试。谷歌官方和非官方,提供了很多帮助我们调试代码的工具和方法。有的使用起来很简单,有的则功能强大,很少有机会接触。因此,我们打算由浅入深的向同学们介绍,知道针对不同的场景,使用合适的工具。
本文针对的读者是:
对安卓程序调试需要指导的新手; 对程序调试没有太多经验的开发者;
在开始以前,假设各位已经做好了如下准备:
已经在搭建好了安卓软件开发平台 一部安卓设备(手机或平板电脑); 一根连接电脑和安卓设备的数据线(通常是micro usb数据线); 半天时间。 耐心与求知欲。
本文将介绍到:
断点调试; 输出log调试;
Device Monitor初步使用 ADB工具 wifi连接设备调试;
第1节 动态调试与静态调试
安卓系统上调试程序,主要通过两种形式:
1. 静态调试:程序在运行到某一个状态的时候,让它暂停,用工具查看程序此时的运行信息,比如某个变量的数值;查看完成后,让程序继续运行,恢复到正常的工作。
2. 动态调试:在程序中,添加日志信息(log),在程序运行的时候,将log指定的信息输出到调试的电脑上。整个过程不会打断程序的运行。
不管哪种调试方式,都需要手机与调试的电脑通过数据线相连,借此传递调试信息。
1.1 设备与电脑的连接
要在设备上进行调试,首先要打开设备的开发者选项,不同品牌的安卓设备界面虽然不尽相同,但使用方式都大同小异:
启动安卓设备上的&设置&应用,进入&关于手机&选项卡;
连续点击&版本号&,直到出现您现在处于开发者模式!的提示信息;
返回上级菜单,进入&开发者选项&,开启调试模式,钩上USB调试;
将手机和电脑用USB数据线连接起来。
在Windows系统,需要为连接上的设备安装ADB驱动:
下载ADB的Windows驱动到电脑本地; 在&我的电脑&上点鼠标右键,选择&管理&,打开&设备管理器&,可以看到没有安装驱动的设备;
为它更新驱动,选择&浏览计算机查找&,
指定下载的ADB驱动目录位置,点击确定后,驱动很快就安装成功了。
点击Android Studio的Android Monitor窗口,就能看到这个连接上的设备了,这个窗口还输出了手机端打印的运行信息。
1.2 部署应用
将应用程序通过Android Studio运行到设备上有两个方式:run app和debug app。
debug app可以设置断点,进行代码的静态调试;而run app不能设置断点,不能对代码进行静态调试。这两种方式可以通过菜单项启动,也可以通过快捷键开始。
点击菜单栏中的绿色的小三角,就是run app;
或者使用debug app的快捷按键shift+F10;
在选定的设备上双击,
此时就可以在设备上看到,我们的程序运行起来了。
1.3 静态调试方法
静态调试就是冻结应用运行的状态,仿佛时间停止了一般,然后我们逐一观察此时程序的各个参数是否符合我们的预期。这种调试方法适用于对时间不敏感的程序。也就是说被调试的程序线程不需要依赖别的线程,即使暂时停止工作也不会影响别的工作线程或者受别的工作线程影响。
在希望代码暂停运行的地方打断点&&在代码前点击一下,出现一个红色的圆点,如果想取消,再点击一次即可。
用debug run的方式部署程序。当程序运行到这段代码的这个位置时,程序将停止下来,切换到Debug窗口。这时,我们就可以观察各个参数了。例如下图右半区域就列出了停止时,各个变量的值;左边区域展示了当时函数到调用栈(谁调用的这个函数)情况。我们可以逐一分析,详细观察,看这些值是否符合我们的预期。
下面的功能,将指定程序暂停后,执行下一步的走向。这些都是断点调试经常使用到的、由我们控制程序运行步骤的功能,所以尽量记住它们对应的快捷方式;
Step Over:执行完成当前断点停留处的代码,然后停在下一行待执行的代码处。
void fun1()
int a = 0;
fun2(); //正等待执行的代码
//下一步待执行的代码
void fun2()
int b = 0;
Step Into:如果当前断点执行处是一个函数,那么执行Step Into后,进入到该函数。
void fun1()
int a = 0;
fun2(); //正等待执行的代码
void fun2()
int b = 0;
//下一步待执行的代码
Step Out:在当前断点执行处执行Step Out后,返回到调用该函数的地方等待执行。
void fun1()
int a = 0;
fun2(); //下一步待执行的代码
void fun2()
int b = 0;
//正等待执行的代码
Resume Program:程序继续往下执行,直到遇到下一个断点。
有的调试功能带有force,例如force step over,它们可以在这种场景下使用:当你想进入不是你写的源代码查看调用过程,但是使用不带force的功能,却没有起作用。简单来说就是不带force的用来跟踪自己写的代码,带force的用来跟踪SDK里的。
1.4 动态调试方法
对于那些和时间相关的程序(不能让程序暂停,等你慢慢观察),我们就不能使用静态调试方法了,得采用动态调试,添加log的方式。
Log的中文名字叫做日志,在界表示程序运行过程中打印出的信息。根据log我们就知道现在程序运行到什么地方了,log还可以携带程序中某些变量的信息输出,让我们更精准的知道程序当前运行的状态。
1.4.1 代码中添加log
在代码中添加一段函数,就能通过特别的工具输出这些log。
在Android代码中添加log的方式如下:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.d(&TAG&, &debug info: function=& + &onCreate()&);
这里面使用了Android提供的Log库。
1.4.2 log的查看
添加了log信息后,将程序通过debug app部署到设备上,就能在Android Monitor工具的logcat窗口中看到对应的信息了。
输出的调试信息如下:
03-22 03:22:39.778 /com.anddle.calculator D/TAG: debug info: function=onCreate()
03-22 03:22:39.778:log产生的时间;
:设备上运行这段代码的进程ID(PID)和线程ID(TID);
com.anddle.calculator:设备上运行这段代码的包名;
D:这条log的类型。我们输出这条log使用的是Log.d(),所以就显示D;如果使用Log.i()就显示I,以此类推;
TAG:就是Log.d()函数的第一个参数;
debug info: function=onCreate():就是Log.d()函数的第二个参数;
Android应用开发的Log库提供了几种不同等级的log:Verbose Debug Info Warining Error,我们可以根据自己log的需要加不同等级的log,使用的形式为:
Log.v(&TAG&,&content is verbose&);
Log.d(&TAG&,&content is debug&);
Log.i(&TAG&,&content is info&);
Log.w(&TAG&,&content is waring&);
Log.e(&TAG&,&content is error&);
我们在应用中调试程序,通常使用d。
1.4.3 log的添加规则
在应用的开发当中,我们对log的添加有一些不成文的技巧,可以提高程序的开发效率。
在调试应用的同一个功能时,为它定义同一个TAG。例如,一个应用有网络通信和本地文件读取两个大功能。那我们就可以为有网络通信定义一个TAG叫做Network,为另一个本地文件读取定义一个TAG叫做FileAccess。这样当我们查看对应的log信息时,就很容易通过关键字把它们从log的海洋里区分开。将TAG定义成一个字符串常量,便于对log输出信息的修改。
static final String TAG1 = &Network&;
static final String TAG2 = &FileAccess&;
Log.d(TAG1,&这是网络通信相关的log!&);
Log.d(TAG2,&这是文件读取的log!&);
使用Debug开关控制log信息是否输出。在调试应用的时候要添加很多log,当应用发布的时候,又要去掉这些log信息。添加或者删除这些log,会增加很多工作。所以我们需要使用Debug开关。
static final boolean DEBUG = true; //true表示打开开关,false表示关闭开关;
Log.d(TAG,&Debug开关打开才输出!&);
输出函数的调用栈。有的时候,我们不仅关注程序执行到当前时各个变量的值是什么,还关心这个函数是怎么被调用到的。那么我们可以在代码中,添加输出调用栈的信息:
Log.d(TAG, Log.getStackTraceString(new Throwable()));
Log.d()在调试代码时使用,用Debug开关控制;Log.e()在出现意外而重要的错误情况时使用,不用Debug开关控制;Log.v() Log.i()和Log.w()在需要输出运行状态并且不涉及暴露应用实现信息的情况时使用,不必用Debug开关控制;当然,开发者想怎么用这些log类型就可以怎么用,并没有特别的约束。当前位置浏览文章
起因高级IDE的Debug功能几乎是必备的,我用的第一个Debug的IDE是Visual Studio(简称VS),那时还是大学。工作之后其实大多数时间开发的是业务为导向的app,调试的几乎也就是看看某些执行流程对不对,或者某些变量的动态值,这些app大多面向网络的,大多数是调试网络接口,用Charles抓包然后加打印Log的方式就可以了。但最近研究AndroidFramework层的功能,简单的调试已经不能满足了,举个简单的例子,Android源码调试,总不能每次加一行Log然后编译一次系统吧=_=从何说起怎样打断点好像所有的IDE,打断点的方式没什么区别吧,就是行号旁边点击一下,看下图:断点打哪.png上图中的断点有三个,分别是Java Field Watchpoints Java Line Breakpoints Java Method Breakpoints,还有几种断点,没法在界面中显示出来。要想看项目中的所有的代码,可以打开Breakpoints控制面板:菜单栏 Run --&View Breakpoints如下图所示:breakpoints.png看左侧的列表分类,断点类型大概总共六类如下表:断点名字中文名字作用Java Line Breakpoint行断点最常见的断点,执行到这一行代码会触发断点Java Method Breakpoint方法断点断点打在方法头那一行,愈加方便的观察参数和返回值Java Field Breakpoint字段断点打在某个字段声明上,当字段被重新赋值的时候触发断点Java Exception BreakpointJava 异常断点当抛出某个异常时,触发断点Exception Breakpoint异常断点未知Symbolic Breakpoint符号异常未知看我左边看右边,右边是对每个断点的详细配置,以行断点为例,其余大同小异(出了上表最后两个):Enable:断点是不是可用Suspend:执行到断点的时候,程序是不是暂停到断点Condition:执行这个断点条件Log message to console :执行到这个断点的时候,打印一行日志Evaluate log: 执行到这个断点时候,打印一样自定义日志,这个日志中可以包含程序中的变量或者求值表达式(很有用,这样可以省去一部分Log)Remove once hit:断点触发一次后就被移除了其余的配置我也没用过,表示不会启动debuggerAS中debugger的启动按钮里面有几个按钮可以尝试都点一下,英文也很容易理解,从下面的进程中选择一个要attach 到debugger上,然后就可以debug这个进程了。启动之后,等到某个断点被触发的时候,就出现了下面的界面。同时可以选择调试类型,如下引自官网:有下列调试类型可供您选择:Auto如果您希望 Android Studio 自动为您要调试的代码选择最合适的选项,请选择此类型。例如,如果您的项目包含任何 C 或 C++ 代码,Android Studio 会自动使用 Hybrid 调试类型。否则,Android Studio 会使用 Java 调试类型。Java如果您只想调试以 Java 编写的代码,请选择此类型 - Java 调试程序会忽略您在原生代码中设置的任何断点或监视。Native如果您只想使用 LLDB 来调试代码,请选择此类型。使用此调试类型时,Java 调试程序会话视图不可用。默认情况下,LLDB 只检查您的原生代码,而会忽略 Java 代码中的断点。如果您也想调试 Java 代码,则应切换到 Auto 或 Hybrid 调试类型。Hybrid如果您想在调试 Java 代码与调试原生代码之间切换,请选择此类型。Android Studio 会将 Java 调试程序和 LLDB 都连接到您的应用进程,一个用于 Java 调试程序,一个用于 LLDB,这样一来,您不必重新启动应用或更改调试配置,便可同时对 Java 代码和原生代码中的断点进行检查调试工具窗口启动调试之后调试面板如下图所示,看起来好复杂,全是按钮,把鼠标悬停在按钮上会出现这个按钮的名字:我的控制台显示面板.png先看控制按钮,再看控制面板:1. 横向控制按钮横向控制按钮,截图来自官网如上图,这些都是基本的单步调试工具所具有的功能,上面很重要的是那个Evaluate Expression通过它可以查看当前类中所有的变量的值,并且可以计算表达式的值,甚至可以运行某个函数,得到结果。可以尝试下,在输入的时候有代码提示,比如在输入框输入我们上面的求和的函数,就能直接得到运行结果。2. 竖向控制按钮纵向控制按钮.png标号名字作用①Rerun android debugger启动或者重启debugger②resume program运行程序,到下一个断点处③pause program暂停程序④stop android debugger停止debugger,终止调试⑤View Breakpoints打开断点设置面板,和从菜单栏Run--&view breakpoints 进入的是同一个⑥Mute Breakpoints暂时停用所有的断点7Get Thread dump获取某个进程的信息⑧Restore Layout恢复原来的debugger控制面板的布局⑨Settings设置在调试过程中,会显示那些信息(可以点开看看)10,11,12固定窗口,关闭窗口,查看帮助3. 调试工具窗口(或者说窗口)名字作用Console控制台,上面设置的断点的log比如Log message to console就打印在这里Frames正在运行的线程的堆栈信息(堆栈帧)Virables每个线程调用栈中的变量Watches观察某个变量或者某个方法的执行结果(这个比较有用)通过点击Watches面板下边的加号可以添加要观察的对象最后看个简单的例子debugger测试用例.png解读一下上面的配置:这个断点是一个行断点,打在了代码21行,目前断点有效(enable),当断点被触发的时候程序会停在断点处等待用户操作(Suspend),这个断点是有触发条件的,必须在for循环中i不等于0的情况下才会触发这个断点(Condition i!=0),当断点触发的时候会在控制台打印一句log通知用户,断点被触发(Log message to console ),并且我们自定义个log,能够打印i+i 的值("计算下"+i+"+"+i+"="+calculate(i,i))。是不是真是这样呢,可以按照上面的步骤启动调试,然后点击按钮使其执行onClick方法,然后执行到这个for循环,看能否能够打印log。运行结果如下:测试结果.png其余类型断点,的配置和调试大同小异,可以点着玩 ̄□ ̄||【参考文献】官网有人说Android 的调试是最坑的,那我只能说是你不会用而已,我可以说Android Studio的调试是我见过最棒的。
下面会将debug模式和Attach模式的断点调试
好了开始写一个简单的调试程序,我们先来一个for循环
设置断点(点击红点位置添加或取消断点)
点击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行。
2. step into:看到方法往里走
比如我们的for循环当中调用了一个stepNext(int i)方法,当我们走到这里想看看这个方法里面的运行过程的时候我们可以这样,当走到这个方法的时候我们可以按下F7,或者如下图的图标。
这时就走到了stepNext方法当中。
在这里打印了一个log,我们再按一下F8我们来看看Logcat, 这里我打印的log都是为了做教程用,调试我们就不用打log了直接看显示面板就OK了
3. force step into :所有方法看完整
这个是可以看到你所调用的所有方法的实现会让你跟着它走一遍,研究源码使用非常方便
4. step out :有断点下一个,走完断点继续走
这里如果我们的一个流程当中,包括调用的方法,如果有断点走到下一个断点,如果没有断点,而是在一个调用的方法当中,会跳出这个方法,继续走。
这里理解比较难,举个例子:
(上图)我现在程序位置在第一个断点位置(24行),我调用的stepNext方法中也有一个断点,此时我按下step out按钮会走到stepNext中的断点处(39行)我此时如果再按一下step out 会走到stepNext方法的调用出的下一个可执行代码(30行)
(上图)如果我现在程序位置在stepNext的方法中,如果我此时按下step out,会走到stepNext方法的调用出的下一个可执行代码(30行)
5. 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到指定进程,条件触发之后就可以直接进入调试模式。之后该怎么做不用我再说了吧?
本文已收录于以下专栏:
相关文章推荐
AndroidStudio动态调试apk
1、添加smalidea插件
2、反编译apk
3、在AndroidMainfest.xml中添加debuggable=“true”
对于我这刚入门的菜鸟来说,我在配置Android的开发环境中,遇到的问题实在是太多了,都快花费我一个星期的时间了,在这期间出了翻墙下载SDK之外,其他的世间都在搞Android virtual dev...
在android studio导出的apk分为4种,一种是未签名调试版apk,一种是未签名发行版apk,一种是已签名调试版apk,还有一种是已签名发行版apk。以下将介绍这4种apk如何导出。
一、配置插件下载插件smalidea地址:
https://bitbucket.org/JesusFreke/smali/downloads下载smalidea-0.03.zip下载完成后,打开an...
作者:程序员小冰,GitHub主页:/QQ
新浪微博:/mcxiaobing大家都知道,我们这些Android...
真他娘的坑爹,今天调试一个程序,在一个Activity里面设置了断点,无论如何代码都不能在断点处停下来,查了一整天才发现原来是这个罪魁祸首解决办法解决办法有两种:
第一种就是调试的时候将android...
按“Debug App”没有效果,就一直往下跑。设置了断点也停不下来。“Step into”等调试选项全部是灰色的。...
在开发的过程中有时候会发现studio无法进入调试模式。就我所知到的原因和解决方法如下:1 . 是否开启了调试:在build.gradle配置文件的buildTypes中将debuggable设置为t...
前言:上篇博客 AndroidStudio-断点调试-也许你该知道断点调试是有多么的美好 ,记录了AndroidStudio上断点调试的基本流程和debug面板按钮介绍.这一篇就给大家分享一点调试的小...
Android Studio目前已经成为开发Android的主要工具,用熟了可谓相当顺手。作为开发者,调试并发现bug,进而解决,可是我们的看家本领。正所谓,工欲善其事必先利其器,和其他开发工具一样,...
他的最新文章
讲师:董晓杰
讲师:姚远
他的热门文章
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)android&studio&C/C++&jni&编写以及调试方法
开发环境 2
编写hello_jni程序 2
运行结果 10
调试程序 10
IDE: android studio 1.1.0
android NDK :R10
android SDK : android -19
编写hello_jni程序
建立一个空的activity项目目录如图:
进入下图标红的文件 MainActivity文件中
添加如下代码在MainActivity类内
&& static {
System.loadLibrary("hello_jni");
&&& public
native& String getstringfromC();
打开终端android studio已经提供了终端如图:
首先进入java目录执行命令:
javah -d ../jni&
com.example.root.ndk_sample.MainActivity
com.example.root.ndk_sample.MainActivity是native函数的所在的包名和类名,中间使用“.”号分开。
这时候就会在java目录下面出现jni目录如图:
添加*.c文件在jni目录中如图:(文件名字为hello_jni.c)
备注:红色方框内的只是为了方便演示调试使用,没有额外的功能。
编写Android.mk和Application.mk 放在jni目录下面。
结构如图:
Android.mk文件的内容如下:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE :=hello_jni
LOCAL_SRC_FILES := hello_jni.c
include $(BUILD_SHARED_LIBRARY)
Application.mk 文件内容为:
APP_ABI := all
APP_OPIM :=debug
配置ndk的目录配置文件为图中标红的地方。
在最后一行添加如下内容:
在红色的方框内的文件夹下的红条出添加如下配置:
&&&&&&&&&&&
moduleName"hello_jni"
在红色的方框内的文件夹下添加蓝色的内容。
在如下图中:
在红色的MainActivity中的oncreate函数中添加蓝色的函数。
此时android调用C语言的的函数已经完成了,此时运行结构如下图:
但是想要调试还要做好多的事情。
在如下图中:
在红框内的文件中添加蓝色的部分(在android{}内)。
在下图中:
在文件androidMainfast.xml中的application
的蓝色框内添加android:debuggable="true"。
将上图中的jni 的debuging配置为true。
在终端中进入jni目录下面执行命令
目录结构会有如下变化。(红色方框内)
在进行调试之前在调用到C语言的函数处打一个断点,如图:
点击debug(红色框内)开始调试:
此时进入main目录下面执行如下命令。
之后会出现如下的信息:
GNU gdb (GDB) 7.6
Copyright (C) 2013 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later
This is free software: you are free to change and redistribute
There is NO WARRANTY, to the extent permitted by
law.& Type "show copying"
and "show warranty" for details.
This GDB was configured as "--host=x86_64-linux-gnu
--target=arm-linux-android".
For bug reporting instructions, please see:
---Type to continue, or q to quit---
warning: Could not load shared library symbols for 86 libraries,
e.g. libstdc++.so.
Use the "info sharedlibrary" command to see the complete
Do you need "set solib-search-path" or "set sysroot"?
0xb6f0a794 in __futex_syscall3 ()
/root/AndroidStudioProjects/NDK_Sample/app/src/main/obj/local/armeabi-v7a/libc.so
执行“l”命令输入如下
JNIEXPORT jstring JNICALL
Java_com_example_root_ndk_1sample_MainActivity_getstringfromC
(JNIEnv *env, jobject obj)
9&&&&&&&&&&
int i = 0,j = 0,k = 0;
打一个断点在第十行命令如下:
在android studio 单步走,这个时候就会进入断点出,之后就可以执行gdb可以使用的命令进行调试了。
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

我要回帖

更多关于 androidstudio调试 的文章

 

随机推荐