Logcat 的使用方法

 

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

 转自:http://hi.baidu.com/xiaor186/item/01f3e6d0825920e6b3f777ef

view plaincopy to clipboardprint?

package com.borqs.logcat;  

  

import android.app.Activity;  

import android.os.Bundle;  

import android.util.Log;  

  

public class Logcat extends Activity {  

    /** Called when the activity is first created. */  

    @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 plaincopy to clipboardprint?

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 plaincopy to clipboardprint?

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 plaincopy to clipboardprint?

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 plaincopy to clipboardprint?

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 plaincopy to clipboardprint?

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 plaincopy to clipboardprint?

# 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 plaincopy to clipboardprint?

# mount -o remount,rw rootfs /   

# logcat -b events -f /tmp/events   

        我们首先需要使用

 

 

view plaincopy to clipboardprint?

# mount -o remount,rw rootfs /   

        将文件系统改为可读写

 

        然后就可以通过

 

view plaincopy to clipboardprint?

# logcat -b events -f /tmp/events   

        来将events buffer中的log信息存入 tmp文件夹下的events文件中

 

        此时我们可以通过打开tmp目录下的events文件来查阅event buffer中的log信息

 

        通过这个命令,我们的log信息就可以较为长久的保存在手机设备中,便于随时查阅

 

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

 

        -g命令的作用是查看三个log buffer的大小

 

        如下所示:

 

view plaincopy to clipboardprint?

# 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命令的作用是设置日志的最大数目 .,默认值是4

 

        -r命令的作用是每 时输出日志,默认值为16

 

view plaincopy to clipboardprint?

# logcat -n 3 -r 20 -f /tmp/events1  

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

 

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

 

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

 

view plaincopy to clipboardprint?

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 plaincopy to clipboardprint?

# logcat -s "Logcat:d"  

D/Logcat  ( 1821): Debug  

I/Logcat  ( 1821): Info  

W/Logcat  ( 1821): Warn  

E/Logcat  ( 1821): Error  

        当我键入

 

view plaincopy to clipboardprint?

# logcat -s "Logcat:d"  

        命令时

 

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

 

        接下来我们再看:

 

view plaincopy to clipboardprint?

# logcat -s "Logcat:i"  

  

I/Logcat  ( 1821): Info  

W/Logcat  ( 1821): Warn  

E/Logcat  ( 1821): Error  

        当我键入

 

view plaincopy to clipboardprint?

# logcat -s "Logcat:i"  

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

 

        接下来我们再看:

 

view plaincopy to clipboardprint?

# logcat -s "Logcat:w"  

W/Logcat  ( 1821): Warn  

E/Logcat  ( 1821): Error  

        当我键入

 

view plaincopy to clipboardprint?

# logcat -s "Logcat:w"  

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

 

        下面我们再看:

 

view plaincopy to clipboardprint?

# logcat -s "Logcat:e"  

E/Logcat  ( 1821): Error  

        当我键入

 

view plaincopy to clipboardprint?

# 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 plaincopy to clipboardprint?

# 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 plaincopy to clipboardprint?

# 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 plaincopy to clipboardprint?

# 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 plaincopy to clipboardprint?

# 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 plaincopy to clipboardprint?

# logcat -v raw -s "Logcat"  

Verbose  

Debug  

Info  

Warn  

Error  

 

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

 

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

 

view plaincopy to clipboardprint?

# 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 plaincopy to clipboardprint?

# 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信息,开发出更为健壮的软件作品。(作者:王植萌)

你可能感兴趣的:(Logcat 的使用方法)