Logcat 的使用方法

 OPhoneLogcat是我们常用的Debug工具,我们通常使用它来查找和定位缺陷信息。 如果我们能够更有效的从大片的Logcat信息中找到对自己有用的部分,就能够更快速准确的找到问题所在,进而完善自己的OPhone应用程序。我们先来建立一个短小的工程logcat:

view plain copy to clipboard print ?
  1. package com.borqs.logcat;  
  2.   
  3. import android.app.Activity;  
  4. import android.os.Bundle;  
  5. import android.util.Log;  
  6.   
  7. public class Logcat extends Activity {  
  8.     /** Called when the activity is first created. */  
  9.     @Override  
  10.     public void onCreate(Bundle savedInstanceState) {  
  11.         super.onCreate(savedInstanceState);  
  12.         setContentView(R.layout.main);  
  13.         Log.v("Logcat""Verbose");  
  14.         Log.d("Logcat""Debug");  
  15.         Log.i("Logcat""Info");  
  16.         Log.w("Logcat""Warn");  
  17.         Log.e("Logcat""Error");  
  18.                 
  19.     }  
  20. }  

        当我们打开模拟器使用#adb shell命令进入设备,然后使用logcat命令时,会出现像下面一样大量的log信息,

 

view plain copy to clipboard print ?
  1. D/skia    (  875): purging 200K from font cache [23 entries]  
  2. I/ActivityManager(  812): Starting activity: Intent { action=android.intent.action.MAIN flags=0x10200000 comp={com.borqs.logcat/com.borqs.logcat.Logcat} }  
  3. V/WindowManager(  812): before computeNewConfigurationLocked(mTempConfiguration)  
  4. V/Logcat  ( 1821): Verbose  
  5. D/Logcat  ( 1821): Debug  
  6. I/Logcat  ( 1821): Info  
  7. W/Logcat  ( 1821): Warn  
  8. E/Logcat  ( 1821): Error  
  9. D/BorqsIME(  896): onStartInput  ccontentType: 0 Restarting:false  
  10. I/ActivityManager(  812): Displayed activity com.borqs.logcat/.Logcat: 285 ms  
  11. D/dalvikvm(  812): GC freed 14185 objects / 618376 bytes in 209ms  

        而由我们所开发的应用Logcat发出的log信息:

view plain copy to clipboard print ?
  1. V/Logcat  ( 1372): Verbose  
  2. D/Logcat  ( 1372): Debug  
  3. I/Logcat  ( 1372): Info  
  4. W/Logcat  ( 1372): Warn  
  5. 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 ?
  1. I/RILC    (  644): AT[0]< +ECSQ: 21,0  
  2. I/RILC    (  644): Rild monitor RIL_onUnsolicitedResponse come in  
  3. I/RILC    (  644):  DEBUG: unsolResponseIndex is 9, and unsolResponseIndexEx is 9  
  4. I/RILC    (  644): Rild monitor RIL_onUnsolicitedResponse leave  

        第三个是 events buffer, events buffer 中提供的是事件相关信息:

        如下所示,即是打开“logcat”应用时的events buffer中的内容:

view plain copy to clipboard print ?
  1. I/dvm_gc_madvise_info(  870): [610304,299008]  
  2. I/force_gc( 1372): bg  
  3. I/dvm_gc_info( 1372): [7813577555038565495,-9097690400892983263,-4021289470961997829,0]  
  4. I/am_create_task(  804): 23  

        当我们对不同的模块进行调试时,我们就要从三个不同buffer中提取对自己有用的信息。

        接下来我们再来学习“-c”命令

        -c命令的作用就是清除已有log信息,当我们查看log信息时,为了减少无用log信息的干扰,我们需要将以前的log信息清除掉,只记录后续动作的log信息。

        如下所示:

view plain copy to clipboard print ?
  1. I/dvm_gc_madvise_info(  870): [610304,299008]  
  2. I/force_gc( 1372): bg  
  3. I/dvm_gc_info( 1372): [7813577555038565495,-9097690400892983263,-4021289470961997829,0]  
  4. I/am_create_task(  804): 23  
  5. # logcat -cb events  
  6. # logcat -b events  

        此时,我们可以看到,logcat信息已经为空了。

        接下来,我们再来学习“-d”命令

        -d命令的意义是在屏幕上显示log信息并在log信息结束后退出。

       还以从OPhone主屏进入logcat应用的events bufferlog信息为例,如下所示:

view plain copy to clipboard print ?
  1. # logcat -db events  
  2. I/dvm_gc_madvise_info(  870): [610304,299008]  
  3. I/force_gc( 1372): bg  
  4. I/dvm_gc_info( 1372): [7813577555038565495,-9097690400892983263,-4021289470961997829,0]  
  5. I/am_create_task(  804): 23  
  6. #   

        我们可以看到终端在log信息全部显示结束后就退出了logcat。

        接下来,我们再来学习“-f”命令

        -f命令的作用是将log信息作为文件保存起来

        还以从OPhone主屏进入logcat应用的events bufferlog信息为例,如下所示:

 

view plain copy to clipboard print ?
  1. # mount -o remount,rw rootfs /   
  2. # logcat -b events -f /tmp/events   

        我们首先需要使用
 

view plain copy to clipboard print ?
  1. # mount -o remount,rw rootfs /   

        将文件系统改为可读写

        然后就可以通过

view plain copy to clipboard print ?
  1. # 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 ?
  1. # logcat -g events  
  2. ring buffer is 64Kb (63Kb consumed), max entry is 4096b, max payload is 4076b  
  3. # logcat -g main  
  4. ring buffer is 64Kb (63Kb consumed), max entry is 4096b, max payload is 4076b  
  5. # logcat -g radio  
  6. 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 ?
  1. # logcat -n 3 -r 20 -f /tmp/events1  

        下面我们来学习一个重要的命令“-s”

        -s命令的作用是设置默认的过滤级别以及过滤信息

        下面我们首先来回顾一下main buffer中的log信息:

view plain copy to clipboard print ?
  1. D/skia    (  875): purging 200K from font cache [23 entries]  
  2. I/ActivityManager(  812): Starting activity: Intent { action=android.intent.action.MAIN flags=0x10200000 comp={com.borqs.logcat/com.borqs.logcat.Logcat} }  
  3. V/WindowManager(  812): before computeNewConfigurationLocked(mTempConfiguration)  
  4. V/Logcat  ( 1821): Verbose  
  5. D/Logcat  ( 1821): Debug  
  6. I/Logcat  ( 1821): Info  
  7. W/Logcat  ( 1821): Warn  
  8. E/Logcat  ( 1821): Error  
  9. D/BorqsIME(  896): onStartInput  ccontentType: 0 Restarting:false  
  10. I/ActivityManager(  812): Displayed activity com.borqs.logcat/.Logcat: 285 ms  
  11. 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 ?
  1. # logcat -s "Logcat:d"  
  2. D/Logcat  ( 1821): Debug  
  3. I/Logcat  ( 1821): Info  
  4. W/Logcat  ( 1821): Warn  
  5. E/Logcat  ( 1821): Error  

        当我键入

view plain copy to clipboard print ?
  1. # logcat -s "Logcat:d"  

        命令时

        我们看到了除了Verbose信息之外的其他级别的log信息。

        接下来我们再看:

view plain copy to clipboard print ?
  1. # logcat -s "Logcat:i"  
  2.   
  3. I/Logcat  ( 1821): Info  
  4. W/Logcat  ( 1821): Warn  
  5. E/Logcat  ( 1821): Error  

        当我键入

view plain copy to clipboard print ?
  1. # logcat -s "Logcat:i"  

        我们看到了除了 Verbose和 Debug之外的其他级别的log信息。

        接下来我们再看:

view plain copy to clipboard print ?
  1. # logcat -s "Logcat:w"  
  2. W/Logcat  ( 1821): Warn  
  3. E/Logcat  ( 1821): Error  

        当我键入

view plain copy to clipboard print ?
  1. # logcat -s "Logcat:w"  

        我们看到了除了Verbose,Debug和Info之外其他高级别的log信息。

        下面我们再看:

view plain copy to clipboard print ?
  1. # logcat -s "Logcat:e"  
  2. E/Logcat  ( 1821): Error  

        当我键入

view plain copy to clipboard print ?
  1. # logcat -s "Logcat:e"  

        我们就只能看到Error及其以上级别的log信息。我们可以用此命令来筛选不同内容,不同级别的log信息,摒除冗余信息的干扰。

        最后我们来学习-v命令

        -v命令的作用是设置log的输出格式

        log的输出格式主要有7种,分别为:

  1. brief — Display priority/tag and PID of originating process (the default format).
  2. process — Display PID only.
  3. tag — Display the priority/tag only.
  4. thread — Display process:thread and priority/tag only.
  5. raw — Display the raw log message, with no other metadata fields.
  6. time — Display the date, invocation time, priority/tag, and PID of the originating process.
  7. long — Display all metadata fields and separate messages with a blank lines.

        下面我们来逐一看一下这7中输出格式各自的特点:

        我们先来看brief格式的log:

view plain copy to clipboard print ?
  1. # logcat  -v brief  
  2.  -s "Logcat"  
  3. V/Logcat  ( 1821): Verbose  
  4. D/Logcat  ( 1821): Debug  
  5. I/Logcat  ( 1821): Info  
  6. W/Logcat  ( 1821): Warn  
  7. E/Logcat  ( 1821): Error  

        这是我们所最为熟悉的一种,也是默认的log类型。

        接下来我们再来看process格式的log:

view plain copy to clipboard print ?
  1. # logcat -v process -s "Logcat"  
  2. V( 1821) Verbose  (Logcat)  
  3. D( 1821) Debug  (Logcat)  
  4. I( 1821) Info  (Logcat)  
  5. W( 1821) Warn  (Logcat)  
  6. E( 1821) Error  (Logcat)  

        Process格式的log把进程id放到了更靠前的位置

        接下来我们再来看tag格式的log:

view plain copy to clipboard print ?
  1. # logcat -v tag -s "Logcat"  
  2. V/Logcat  : Verbose  
  3. D/Logcat  : Debug  
  4. I/Logcat  : Info  
  5. W/Logcat  : Warn  
  6. E/Logcat  : Error  

        tag格式的log不包含进程id,将log的信息显示在了每行log的结尾

        接下来我们再来看看thread格式的log:

view plain copy to clipboard print ?
  1. # logcat -v thread -s "Logcat"  
  2. V( 1821:0x71d) Verbose  
  3. D( 1821:0x71d) Debug  
  4. I( 1821:0x71d) Info  
  5. W( 1821:0x71d) Warn  
  6. E( 1821:0x71d) Error  

         Thread格式的log信息包含进程id,线程号以及log的级别信息

        接下来我们再来看看raw格式的log:

view plain copy to clipboard print ?
  1. # logcat -v raw -s "Logcat"  
  2. Verbose  
  3. Debug  
  4. Info  
  5. Warn  
  6. Error  


        Raw格式的log只包含log中的内容,而不包含进程id,log级别等信息

        接下来我们再来看一下time格式的log:

view plain copy to clipboard print ?
  1. # logcat -v time -s "Logcat"    
  2. 08-11 16:58:46.130 V/Logcat  ( 1821): Verbose  
  3. 08-11 16:58:46.130 D/Logcat  ( 1821): Debug  
  4. 08-11 16:58:46.130 I/Logcat  ( 1821): Info  
  5. 08-11 16:58:46.130 W/Logcat  ( 1821): Warn  
  6. 08-11 16:58:46.130 E/Logcat  ( 1821): Error  

        Raw格式的log比brief格式的log多了此log被调用的日期时间

        最后我们来看一下long格式的log:

view plain copy to clipboard print ?
  1. # logcat -v long -s "Logcat"  
  2. 08-11 16:58:46.130  1821:0x71d V/Logcat   ]  
  3. Verbose  
  4. 08-11 16:58:46.130  1821:0x71d D/Logcat   ]  
  5. Debug  
  6. 08-11 16:58:46.130  1821:0x71d I/Logcat   ]  
  7. Info  
  8. 08-11 16:58:46.130  1821:0x71d W/Logcat   ]  
  9. Warn  
  10. 08-11 16:58:46.130  1821:0x71d E/Logcat   ]  
  11. Error  

        long格式的log和raw格式的log形成了鲜明的对比,log中包括了此log被调用的时间,进程id,线程号,log级别和标记信息和log信息是所有log格式中最全面的一种。

        我们在查看log信息时,可以根据不同的需要来调用不同格式的log信息。

        总之,logcat是一个非常有用的程序调试工具。我们在程序中所发现的bug,通常需要测试人员将log信息记录下来供开发人员寻找缺陷的原因。特别是对于一些很严重,但是很难重现的bug而言,log信息更是非常珍贵的线索。所以,无论是对于开发人员还是测试人员来说,能否充分的利用和提取log中的有效信息是能否发现程序中已暴露缺陷的根源,进而解决此缺陷的关键因素。希望本文能够起到一个抛砖引玉的作用,希望热爱OPhone应用软件开发的朋友们能够更好的利用log信息,开发出更为健壮的软件作品。

你可能感兴趣的:(thread,buffer,action,OPhone,events,程序调试工具)