adb logcat 打印内核消息

 有空试试。
adb logcat 打印内核消息
2012-02-08 10:40:16      我来说两句 
收藏    我要投稿    [字体: ]

在默认情况下,adb logcat只能显示应用程序的调试信息,我把logcat.cpp修改了一下,让它同时可以打印内核调试信息:

修改的文件:system/core/logcat/logcat.cpp

1、首先先加入头文件
#include <sys/klog.h> //add by

2、定义所使用的TAG
#define KERNEL_TAG "Kernel"

3、替换readLogLines函数

static void readLogLines(log_device_t* devices) 

    log_device_t* dev; 
    int max = 0; 
    int ret; 
    int queued_lines = 0; 
    bool sleep = true; 
    char buffer[256] = {0}; //add by zhaofei  
 
 
    int result; 
    fd_set readset; 
 
 
    for (dev=devices; dev; dev = dev->next) { 
        if (dev->fd > max) { 
            max = dev->fd; 
        } 
    } 
 
 
    while (1) { 
        do { 
            timeval timeout = { 0, 5000 /* 5ms */ }; // If we oversleep it's ok, i.e. ignore EINTR.  
            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 = new queued_entry_t(); 
                    /* NOTE: driver guarantees we read exactly one full entry */ 
                    ret = read(dev->fd, entry->buf, LOGGER_ENTRY_MAX_LEN); 
                    if (ret < 0) { 
                        if (errno == EINTR) { 
                            delete entry; 
                            goto next; 
                        } 
                        if (errno == EAGAIN) { 
                            delete entry; 
                            break; 
                        } 
                        perror("logcat read"); 
                        exit(EXIT_FAILURE); 
                    } 
                    else if (!ret) { 
                        fprintf(stderr, "read: Unexpected EOF!\n"); 
                        exit(EXIT_FAILURE); 
                    } 
 
 
                    entry->entry.msg[entry->entry.len] = '\0'; 
 
 
                    dev->enqueue(entry); 
                    ++queued_lines; 
 
 
#if 1 //read kernel log  
                    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) { 
                // we did our short timeout trick and there's nothing new  
                // print everything we have and wait for more data  
                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; 
                } 
 
 
                // the caller requested to just dump the log and exit  
                if (g_nonblock) { 
                    exit(0); 
                } 
            } else { 
                // print all that aren't the last in their list  
                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:I

摘自 zhangjie201412的专栏

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值