在默认情况下,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};//addby Jay Zhang
- intresult;
- fd_setreadset;
- for(dev=devices;dev;dev=dev->next){
- if(dev->fd>max){
- max=dev->fd;
- }
- }
- while(1){
- do{
- timevaltimeout={0,5000/*5ms*/};//Ifweoversleepit'sok,i.e.ignoreEINTR.
- 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();
- /*NOTE:driverguaranteeswereadexactlyonefullentry*/
- 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();
- /*priority*/
- entry->entry.msg[0]=Android_LOG_INFO;
- /*tag*/
- strcpy(entry->entry.msg+1,KERNEL_TAG);
- /*message*/
- 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';
- /*
- if(g_printBinary){
- printBinary(dev,entry->entry);
- }else{
- (void)processBuffer(dev,entry->entry);
- }
- */
- printNextEntry(dev);
- }
- }
- #endif
- }
- }
- if(result==0){
- //wedidourshorttimeouttrickandthere'snothingnew
- //printeverythingwehaveandwaitformoredata
- 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;
- }
- //thecallerrequestedtojustdumpthelogandexit
- if(g_nonblock){
- exit(0);
- }
- }else{
- //printallthataren'tthelastintheirlist
- 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:
- ;
- }
- }
然后就可以使用logcat来抓取kernel的log了!
若只打印内核消息,使用:adb logcat -s Kernel:I
http://www.linuxidc.com/Linux/2011-09/43674.htm