OPhoneLogcat是我们常用的Debug工具,我们通常使用它来查找和定位缺陷信息。 如果我们能够更有效的从大片的Logcat信息中找到对自己有用的部分,就能够更快速准确的找到问题所在,进而完善自己的OPhone应用程序。我们先来建立一个短小的工程logcat:
view plain copy to clipboard print ?
- package com.borqs.logcat;
-
- import android.app.Activity;
- import android.os.Bundle;
- import android.util.Log;
-
- public class Logcat extends Activity {
-
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- Log.v("Logcat", "Verbose");
- Log.d("Logcat", "Debug");
- Log.i("Logcat", "Info");
- Log.w("Logcat", "Warn");
- Log.e("Logcat", "Error");
-
- }
- }
当我们打开模拟器使用#adb shell命令进入设备,然后使用logcat命令时,会出现像下面一样大量的log信息,
view plain copy to clipboard print ?
- D/skia ( 875): purging 200K from font cache [23 entries]
- I/ActivityManager( 812): Starting activity: Intent { action=android.intent.action.MAIN flags=0x10200000 comp={com.borqs.logcat/com.borqs.logcat.Logcat} }
- V/WindowManager( 812): before computeNewConfigurationLocked(mTempConfiguration)
- V/Logcat ( 1821): Verbose
- D/Logcat ( 1821): Debug
- I/Logcat ( 1821): Info
- W/Logcat ( 1821): Warn
- E/Logcat ( 1821): Error
- D/BorqsIME( 896): onStartInput ccontentType: 0 Restarting:false
- I/ActivityManager( 812): Displayed activity com.borqs.logcat/.Logcat: 285 ms
- D/dalvikvm( 812): GC freed 14185 objects / 618376 bytes in 209ms
而由我们所开发的应用Logcat发出的log信息:
view plain copy to clipboard print ?
- V/Logcat ( 1372): Verbose
- D/Logcat ( 1372): Debug
- I/Logcat ( 1372): Info
- W/Logcat ( 1372): Warn
- E/Logcat ( 1372): Error
就被掩埋其中。
那么,如何才能更好的利用logcat这个工具来为我们服务呢?
首先,我们要来学习一下“-b”指令
-b指令的作用是指定打开不同的log buffer。我们常用的log buffer一共有三个。
第一个就是上文我们看到的logcat默认buffer-main buffer. Main buffer中提供设备运行的主要log信息。
第二个是radio buffer,radio buffer中提供的是无线电和电话相关信息。
如下所示,即是打开”logcat”应用时的radio buffer中的内容:
view plain copy to clipboard print ?
- I/RILC ( 644): AT[0]< +ECSQ: 21,0
- I/RILC ( 644): Rild monitor RIL_onUnsolicitedResponse come in
- I/RILC ( 644): DEBUG: unsolResponseIndex is 9, and unsolResponseIndexEx is 9
- I/RILC ( 644): Rild monitor RIL_onUnsolicitedResponse leave
第三个是 events buffer, events buffer 中提供的是事件相关信息:
如下所示,即是打开“logcat”应用时的events buffer中的内容:
view plain copy to clipboard print ?
- I/dvm_gc_madvise_info( 870): [610304,299008]
- I/force_gc( 1372): bg
- I/dvm_gc_info( 1372): [7813577555038565495,-9097690400892983263,-4021289470961997829,0]
- I/am_create_task( 804): 23
当我们对不同的模块进行调试时,我们就要从三个不同buffer中提取对自己有用的信息。
接下来我们再来学习“-c”命令
-c命令的作用就是清除已有log信息,当我们查看log信息时,为了减少无用log信息的干扰,我们需要将以前的log信息清除掉,只记录后续动作的log信息。
如下所示:
view plain copy to clipboard print ?
- I/dvm_gc_madvise_info( 870): [610304,299008]
- I/force_gc( 1372): bg
- I/dvm_gc_info( 1372): [7813577555038565495,-9097690400892983263,-4021289470961997829,0]
- I/am_create_task( 804): 23
- # logcat -cb events
- # logcat -b events
此时,我们可以看到,logcat信息已经为空了。
接下来,我们再来学习“-d”命令
-d命令的意义是在屏幕上显示log信息并在log信息结束后退出。
还以从OPhone主屏进入logcat应用的events bufferlog信息为例,如下所示:
view plain copy to clipboard print ?
- # logcat -db events
- I/dvm_gc_madvise_info( 870): [610304,299008]
- I/force_gc( 1372): bg
- I/dvm_gc_info( 1372): [7813577555038565495,-9097690400892983263,-4021289470961997829,0]
- I/am_create_task( 804): 23
- #
我们可以看到终端在log信息全部显示结束后就退出了logcat。
接下来,我们再来学习“-f”命令
-f命令的作用是将log信息作为文件保存起来
还以从OPhone主屏进入logcat应用的events bufferlog信息为例,如下所示:
view plain copy to clipboard print ?
- # mount -o remount,rw rootfs /
- # logcat -b events -f /tmp/events
我们首先需要使用
view plain copy to clipboard print ?
- # mount -o remount,rw rootfs /
将文件系统改为可读写
然后就可以通过
view plain copy to clipboard print ?
- # logcat -b events -f /tmp/events
来将events buffer中的log信息存入 tmp文件夹下的events文件中
此时我们可以通过打开tmp目录下的events文件来查阅event buffer中的log信息
通过这个命令,我们的log信息就可以较为长久的保存在手机设备中,便于随时查阅
接下来,我们再来学习“-g”命令
-g命令的作用是查看三个log buffer的大小
如下所示:
view plain copy to clipboard print ?
- # logcat -g events
- ring buffer is 64Kb (63Kb consumed), max entry is 4096b, max payload is 4076b
- # logcat -g main
- ring buffer is 64Kb (63Kb consumed), max entry is 4096b, max payload is 4076b
- # logcat -g radio
- ring buffer is 64Kb (63Kb consumed), max entry is 4096b, max payload is 4076b
接下来,我们再来学习“-n”和“-r”命令
这个命令需要和-f命令配套使用
-n命令的作用是设置日志的最大数目<count> .,默认值是4
-r命令的作用是每<kbytes> 时输出日志,默认值为16
view plain copy to clipboard print ?
- # logcat -n 3 -r 20 -f /tmp/events1
下面我们来学习一个重要的命令“-s”
-s命令的作用是设置默认的过滤级别以及过滤信息
下面我们首先来回顾一下main buffer中的log信息:
view plain copy to clipboard print ?
- D/skia ( 875): purging 200K from font cache [23 entries]
- I/ActivityManager( 812): Starting activity: Intent { action=android.intent.action.MAIN flags=0x10200000 comp={com.borqs.logcat/com.borqs.logcat.Logcat} }
- V/WindowManager( 812): before computeNewConfigurationLocked(mTempConfiguration)
- V/Logcat ( 1821): Verbose
- D/Logcat ( 1821): Debug
- I/Logcat ( 1821): Info
- W/Logcat ( 1821): Warn
- E/Logcat ( 1821): Error
- D/BorqsIME( 896): onStartInput ccontentType: 0 Restarting:false
- I/ActivityManager( 812): Displayed activity com.borqs.logcat/.Logcat: 285 ms
- D/dalvikvm( 812): GC freed 14185 objects / 618376 bytes in 209ms
我们可以看到log中有 V,D,I,W,E开头的不同log信息,事实上还有2种并不常见的级别更高的log信息F和S。
他们分别代表着不同的log级别
V — Verbose (最低级别)
D — Debug
I — Info
W — Warning
E — Error
F — Fatal
S — Silent (最高级别)
下面我们来依次看一下使用不同的过滤级别所看到的log信息。
view plain copy to clipboard print ?
- # logcat -s "Logcat:d"
- D/Logcat ( 1821): Debug
- I/Logcat ( 1821): Info
- W/Logcat ( 1821): Warn
- E/Logcat ( 1821): Error
当我键入
view plain copy to clipboard print ?
- # logcat -s "Logcat:d"
命令时
我们看到了除了Verbose信息之外的其他级别的log信息。
接下来我们再看:
view plain copy to clipboard print ?
- # logcat -s "Logcat:i"
-
- I/Logcat ( 1821): Info
- W/Logcat ( 1821): Warn
- E/Logcat ( 1821): Error
当我键入
view plain copy to clipboard print ?
- # logcat -s "Logcat:i"
我们看到了除了 Verbose和 Debug之外的其他级别的log信息。
接下来我们再看:
view plain copy to clipboard print ?
- # logcat -s "Logcat:w"
- W/Logcat ( 1821): Warn
- E/Logcat ( 1821): Error
当我键入
view plain copy to clipboard print ?
- # logcat -s "Logcat:w"
我们看到了除了Verbose,Debug和Info之外其他高级别的log信息。
下面我们再看:
view plain copy to clipboard print ?
- # logcat -s "Logcat:e"
- E/Logcat ( 1821): Error
当我键入
view plain copy to clipboard print ?
- # logcat -s "Logcat:e"
我们就只能看到Error及其以上级别的log信息。我们可以用此命令来筛选不同内容,不同级别的log信息,摒除冗余信息的干扰。
最后我们来学习-v命令
-v命令的作用是设置log的输出格式
log的输出格式主要有7种,分别为:
- brief — Display priority/tag and PID of originating process (the default format).
- process — Display PID only.
- tag — Display the priority/tag only.
- thread — Display process:thread and priority/tag only.
- raw — Display the raw log message, with no other metadata fields.
- time — Display the date, invocation time, priority/tag, and PID of the originating process.
- long — Display all metadata fields and separate messages with a blank lines.
下面我们来逐一看一下这7中输出格式各自的特点:
我们先来看brief格式的log:
view plain copy to clipboard print ?
- # logcat -v brief
- -s "Logcat"
- V/Logcat ( 1821): Verbose
- D/Logcat ( 1821): Debug
- I/Logcat ( 1821): Info
- W/Logcat ( 1821): Warn
- E/Logcat ( 1821): Error
这是我们所最为熟悉的一种,也是默认的log类型。
接下来我们再来看process格式的log:
view plain copy to clipboard print ?
- # logcat -v process -s "Logcat"
- V( 1821) Verbose (Logcat)
- D( 1821) Debug (Logcat)
- I( 1821) Info (Logcat)
- W( 1821) Warn (Logcat)
- E( 1821) Error (Logcat)
Process格式的log把进程id放到了更靠前的位置
接下来我们再来看tag格式的log:
view plain copy to clipboard print ?
- # logcat -v tag -s "Logcat"
- V/Logcat : Verbose
- D/Logcat : Debug
- I/Logcat : Info
- W/Logcat : Warn
- E/Logcat : Error
tag格式的log不包含进程id,将log的信息显示在了每行log的结尾
接下来我们再来看看thread格式的log:
view plain copy to clipboard print ?
- # logcat -v thread -s "Logcat"
- V( 1821:0x71d) Verbose
- D( 1821:0x71d) Debug
- I( 1821:0x71d) Info
- W( 1821:0x71d) Warn
- E( 1821:0x71d) Error
Thread格式的log信息包含进程id,线程号以及log的级别信息
接下来我们再来看看raw格式的log:
view plain copy to clipboard print ?
- # logcat -v raw -s "Logcat"
- Verbose
- Debug
- Info
- Warn
- Error
Raw格式的log只包含log中的内容,而不包含进程id,log级别等信息
接下来我们再来看一下time格式的log:
view plain copy to clipboard print ?
- # logcat -v time -s "Logcat"
- 08-11 16:58:46.130 V/Logcat ( 1821): Verbose
- 08-11 16:58:46.130 D/Logcat ( 1821): Debug
- 08-11 16:58:46.130 I/Logcat ( 1821): Info
- 08-11 16:58:46.130 W/Logcat ( 1821): Warn
- 08-11 16:58:46.130 E/Logcat ( 1821): Error
Raw格式的log比brief格式的log多了此log被调用的日期时间
最后我们来看一下long格式的log:
view plain copy to clipboard print ?
- # logcat -v long -s "Logcat"
- [ 08-11 16:58:46.130 1821:0x71d V/Logcat ]
- Verbose
- [ 08-11 16:58:46.130 1821:0x71d D/Logcat ]
- Debug
- [ 08-11 16:58:46.130 1821:0x71d I/Logcat ]
- Info
- [ 08-11 16:58:46.130 1821:0x71d W/Logcat ]
- Warn
- [ 08-11 16:58:46.130 1821:0x71d E/Logcat ]
- Error
long格式的log和raw格式的log形成了鲜明的对比,log中包括了此log被调用的时间,进程id,线程号,log级别和标记信息和log信息是所有log格式中最全面的一种。
我们在查看log信息时,可以根据不同的需要来调用不同格式的log信息。
总之,logcat是一个非常有用的程序调试工具。我们在程序中所发现的bug,通常需要测试人员将log信息记录下来供开发人员寻找缺陷的原因。特别是对于一些很严重,但是很难重现的bug而言,log信息更是非常珍贵的线索。所以,无论是对于开发人员还是测试人员来说,能否充分的利用和提取log中的有效信息是能否发现程序中已暴露缺陷的根源,进而解决此缺陷的关键因素。希望本文能够起到一个抛砖引玉的作用,希望热爱OPhone应用软件开发的朋友们能够更好的利用log信息,开发出更为健壮的软件作品。