Logcat中添加kernal log

要在Native code中使用logcat,首先在代码中要引入 log的头文件。
           
           #include <android/log.h>

然后可以通过 __android_log_write(ANDROID_LOG_ERROR,"Tag","Message");

方法向logcat输出。

log 级别:
   
    ANDROID_LOG_UNKNOWN,

    ANDROID_LOG_DEFAULT,   

    ANDROID_LOG_VERBOSE,
 
   ANDROID_LOG_DEBUG,
 
   ANDROID_LOG_INFO,

    ANDROID_LOG_WARN,

    ANDROID_LOG_ERROR,
 
   ANDROID_LOG_FATAL,
 
   ANDROID_LOG_SILENT,

另外编译文件也需要修改:添加 LOCAL_LDLIBS :=  -L$(SYSROOT)/usr/lib -llog (其中-L参数是指定了搜索lib的路径


在默认情况下,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了!

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值