在默认情况下,adb logcat只能显示应用程序的调试信息,我把logcat.cpp修改了一下,让它同时可以打印内核调试信息:
修改的文件:system/core/logcat/logcat.cpp
1、首先先加入头文件
#include <sys/klog.h> //add by Jay
2、定义所使用的TAG
#define KERNEL_TAG "Kernel"
3、替换readLogLines函数
-
staticvoidreadLogLines(log_device_t*devices)
-
{
-
log_device_t*dev;
-
intmax=0;
-
intret;
-
intqueued_lines=0;
-
boolsleep=true;
-
charbuffer[256]={0};
-
-
-
intresult;
-
fd_setreadset;
-
-
-
for(dev=devices;dev;dev=dev->next){
-
if(dev->fd>max){
-
max=dev->fd;
-
}
-
}
-
-
-
while(1){
-
do{
-
timevaltimeout={0,5000};
-
FD_ZERO(&readset);
-
for(dev=devices;dev;dev=dev->next){
-
FD_SET(dev->fd,&readset);
-
}
-
result=select(max+1,&readset,NULL,NULL,sleep?NULL:&timeout);
-
}while(result==-1&&errno==EINTR);
-
-
-
if(result>=0){
-
for(dev=devices;dev;dev=dev->next){
-
if(FD_ISSET(dev->fd,&readset)){
-
queued_entry_t*entry=newqueued_entry_t();
-
-
ret=read(dev->fd,entry->buf,LOGGER_ENTRY_MAX_LEN);
-
if(ret<0){
-
if(errno==EINTR){
-
deleteentry;
-
gotonext;
-
}
-
if(errno==EAGAIN){
-
deleteentry;
-
break;
-
}
-
perror("logcatread");
-
exit(EXIT_FAILURE);
-
}
-
elseif(!ret){
-
fprintf(stderr,"read:UnexpectedEOF!\n");
-
exit(EXIT_FAILURE);
-
}
-
-
-
entry->entry.msg[entry->entry.len]='\0';
-
-
-
dev->enqueue(entry);
-
++queued_lines;
-
-
-
#if1//readkernellog
-
if((ret=klogctl(9,buffer,sizeof(buffer)))>0){
-
if((ret=klogctl(2,buffer,sizeof(buffer)))>0){
-
entry->entry.tid=0;
-
entry->entry.pid=getpid();
-
-
entry->entry.msg[0]=Android_LOG_INFO;
-
-
strcpy(entry->entry.msg+1,KERNEL_TAG);
-
-
strncpy(entry->entry.msg+1+sizeof(KERNEL_TAG),buffer,ret);
-
entry->entry.len=1+sizeof(KERNEL_TAG)+ret+1;
-
entry->entry.msg[entry->entry.len]='/0';
-
-
-
-
-
-
-
-
printNextEntry(dev);
-
}
-
}
-
#endif
-
}
-
}
-
-
-
if(result==0){
-
-
-
sleep=true;
-
while(true){
-
chooseFirst(devices,&dev);
-
if(dev==NULL){
-
break;
-
}
-
if(g_tail_lines==0||queued_lines<=g_tail_lines){
-
printNextEntry(dev);
-
}else{
-
skipNextEntry(dev);
-
}
-
--queued_lines;
-
}
-
-
-
-
if(g_nonblock){
-
exit(0);
-
}
-
}else{
-
-
sleep=false;
-
while(g_tail_lines==0||queued_lines>g_tail_lines){
-
chooseFirst(devices,&dev);
-
if(dev==NULL||dev->queue->next==NULL){
-
break;
-
}
-
if(g_tail_lines==0){
-
printNextEntry(dev);
-
}else{
-
skipNextEntry(dev);
-
}
-
--queued_lines;
-
}
-
}
-
}
-
next:
-
;
-
}
-
}
这里没有把内核调试信息的级别转换成Androind的LOG级别,entry->entry.msg[0] =Android_LOG_INFO;使用了ANDROID_LOG_INFO级别,进程ID用了当前的进程ID。然后就可以使用logcat来抓取kernel的log了!
若只打印内核消息,使用:adb logcat -s Kernel:Ihttp://www.linuxidc.com/Linux/2011-09/43674.htm
分享到:
相关推荐
替换system/core/logcat目录,可以支持adb logcat 的kernel打印
ADB logcat 查询工具,解决调试android应用时日志抓取问题,再也不为日志内容一晃而过烦恼了
android的日志查看工具,运行依赖于adb logcat,所以必须配置好adb的环境变量。
adb logcat 教程,ADB使用教程.pdf
编译该工程源码生成kernellogd程序,通过adb push到手机,然后执行kernellogd 之后,就可以打印输出内核的调试日志信息
例如使用adb logcat 但是读取log后,log文本中除了期望的数据,还有其他很多数据,为了有针对性的将期望数据筛选出来如电池电压,温度,电量等信息,可以通过这个matlab函数实现。具体的引用脚本为: fid = fopen...
android的日志查看工具,运行依赖于adb logcat,所以必须配置好adb的环境变量。 修复部分乱码问题
buildroot方式移植logcat,目前我用的内核时linux-4.19,该资源包里面包含以下文件 adb-logcat_dl.tar.gz android_logger.tar.gz package_adb_logcat.tar.gz package_android-tools.tar.gz
运用bat脚本打包logcat、adb shell语句等代码,并克服了进入shell后后续代码无法执行的问题
Android SDK中adb logcat命令的一种色彩丰富且高度可配置的替代方法。 注意:logcat-color定位于OS X和Linux,当前在Windows中不起作用。 安装 使用pip / easy_install安装(可能需要sudo) $ [sudo] pip install ...
NULL 博文链接:https://mtj13617254943-126-com.iteye.com/blog/1004521
adb logcat查看日志工具,注意:必须有root权限才能查看完整logcat信息。详细介绍请点击http://developer.t-firefly.com/forum.php?mod=viewthread&tid=202&page=1&extra=#pid369
本文主要介绍Android shell命令行中过滤adb logcat输出的方法,这里整理了几种方法,并详细的说明,有需要的朋友可以参考下
本文就具体介绍几种在shell命令行中过滤adb logcat输出的方法。 1、只显示需要的输出(白名单) 最方便的当然是通过管道使用 grep 过滤了,这样可以使用 grep 强大的正则表达式匹配。简单的匹配一行当中的某个...
ADB & Logcat工具使用环境准备.pdfADB & Logcat工具使用环境准备.pdf
一、 Android 常用开发术语 二、 Android模拟器 三、 Android开发中LogCat工具的使用 四、 Android的ADB工具使用
仅支持mac osx,Linux还未测试。暂不支持Windows。 shell脚本,输入参数【包名】,可以获取当前应用的全部日志。该应用有多个进程, 也支持获取。