您的位置:首页 > 移动开发 > Android开发

android 抓完整的log的方式(包括logcat抓所有非内核log)

2013-08-03 11:23 1246 查看
log 分为 kernel , main, events ,radio 几种log



kernel属于 linux内核的log ,通过读取 /proc/kmsg 或者通过串口来抓取。

USB连接手机抓取方式:

adb shell cat /proc/kmsg > kernel.log

串口抓取方式:

在串口终端中设置对应的串口波特率,打开相应的串口。获取log。



main, events ,radio 是 framework的log ,包括cpp 和 java代码的log。





radio 可以抓ril层的log, 抓取方式:

adb logcat -b radio -v time > radio.txt

-v time 表示在log中加入每条log发生的时间。



main log 和我们从DDMS中看到的log是一致的。

抓取方式:

adb logcat -b main -v time > main.txt



event log 属于system log

抓取方式:

    adb logcat -b events -v time > events.log





其实我们不知道,logcat -b的 选项是可以复用的!第一次发现这个,我是从logcat 实现的源码中发现的。

请看下面的show_help 函数中的 红色字体。 The default is -b main -b system ,意思是说,如果我们不加 -b 选项的话,默认就是 -b main -b system 两种log。



这样我们要抓 所有的 非内核的log 就变得比较方便的。那么我们只需要把所有的四种类型的log 都加进 -b 选项中。

那么我们就可以打印所有的log啦!如下命令即可实现:



adb logcat
-b main -b system -b radio -b events -v time > all_user.log




并且,我们也可以对比 radio 和events 等各种类型的log,因为有个 时间标签,我们可以知道 不同类型的log之间的顺序。

这样子,我们就不用去开两个终端去分别抓取不同类型的log了。是不是很爽!?



#ls /dev/log/

events

ksystem

main

radio

system



事实上,我还发现了 /dev/log/ 目录下 另外还有一个很多资料当中没有提到过的 ksystem 的 设备节点。这个可能是用于获取其它信息的。目前我还没有去研究,这个设备节点是用来干什么的。如果有人知道,请告知。谢谢。





"system/core/include/cutils/logger.h"

#define LOGGER_LOG_MAIN "log/main"

#define LOGGER_LOG_RADIO "log/radio"

#define LOGGER_LOG_EVENTS "log/events"

#define LOGGER_LOG_SYSTEM "log/system"





"system/core/logcat/logcat.cpp"



static void show_help(const char *cmd)

{

fprintf(stderr,"Usage: %s [options] [filterspecs]\n", cmd);

fprintf(stderr, "options include:\n"

" -s Set default filter to silent.\n"

" Like specifying filterspec '*:s'\n"

" -f <filename> Log to file. Default to stdout\n"

" -r [<kbytes>] Rotate log every kbytes. (16 if unspecified). Requires -f\n"

" -n <count> Sets max number of rotated logs to <count>, default 4\n"

" -v <format> Sets the log print format, where <format> is one of:\n\n"

" brief process tag thread raw time threadtime long\n\n"

" -c clear (flush) the entire log and exit\n"

" -d dump the log and then exit (don't block)\n"

" -t <count> print only the most recent <count> lines (implies -d)\n"

" -g get the size of the log's ring buffer and exit\n"

" -b <buffer> Request alternate ring buffer, 'main', 'system', 'radio'\n"

" or 'events'. Multiple -b parameters are allowed and the\n"

" results are interleaved. The default is -b main -b system.\n"

" -B output the log in binary");

fprintf(stderr,"\nfilterspecs are a series of \n"

" <tag>[:priority]\n\n"

"where <tag> is a log component tag (or * for all) and priority is:\n"

" V Verbose\n"

" D Debug\n"

" I Info\n"

" W Warn\n"

" E Error\n"

" F Fatal\n"

" S Silent (supress all output)\n"

"\n'*' means '*:d' and <tag> by itself means <tag>:v\n"

"\nIf not specified on the commandline, filterspec is set from ANDROID_LOG_TAGS.\n"

"If no filterspec is found, filter defaults to '*:I'\n"

"\nIf not specified with -v, format is set from ANDROID_PRINTF_LOG\n"

"or defaults to \"brief\"\n\n");



}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐