AndroidStudio高级代码调试功能

一、起因

高级IDE的Debug功能几乎是必备的,我用的第一个Debug的IDE是Visual Studio(简称VS),那时还是大学。工作之后其实大多数时间开发的是业务为导向的app,调试的几乎也就是看看某些执行流程对不对,或者某些变量的动态值,这些app大多面向网络的,大多数是调试网络接口,用Charles抓包然后加打印Log的方式就可以了。但最近研究AndroidFramework层的功能,简单的调试已经不能满足了,举个简单的例子,Android源码调试,总不能每次加一行Log然后编译一次系统吧=_=

二、从何说起

1. 如何打断点

好像所有的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 Breakpoint Java 异常断点 当抛出某个异常时,触发断点
Exception Breakpoint 异常断点 未知
Symbolic Breakpoint 符号异常 未知

看我左边看右边,右边是对每个断点的详细配置,以行断点为例,其余大同小异(出了上表最后两个):

  • Enable:断点是不是可用
  • Suspend:执行到断点的时候,程序是不是暂停到断点
  • Condition:执行这个断点条件
  • Log message to console :执行到这个断点的时候,打印一行日志
  • Evaluate and log: 执行到这个断点时候,打印一样自定义日志,这个日志中可以包含程序中的变量或者求值表达式(很有用,这样可以省去一部分Log)
  • Remove once hit:断点触发一次后就被移除了

其余的配置我也没用过,表示不会

2. 启动debugger

AS中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 代码和原生代码中的断点进行检查

3. 调试工具窗口

启动调试之后调试面板如下图所示,看起来好复杂,全是按钮,把鼠标悬停在按钮上会出现这个按钮的名字:


我的控制台显示面板.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 暂时停用所有的断点
7 Get 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

其余类型断点,的配置和调试大同小异,可以点着玩 ̄□ ̄||

【参考文献】

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,445评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,889评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,047评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,760评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,745评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,638评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,011评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,669评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,923评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,655评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,740评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,406评论 4 320
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,995评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,961评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,023评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,483评论 2 342

推荐阅读更多精彩内容