注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

民主与科学

独立之人格,自由之思想

 
 
 

日志

 
 

Logcat源码分析(二)  

2011-10-13 14:14:09|  分类: 深入研究 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
继续往下看logcat.cppmain函数,它调用setupOutput()函数来初始化输出文件:
Android::setupOutput(); 

setupOutput()函数定义如下:

static void setupOutput()  
{  
  
    if (g_outputFileName == NULL) {  
        g_outFD = STDOUT_FILENO;  
  
    } else {  
        struct stat statbuf;  
  
        g_outFD = openLogFile (g_outputFileName);  
  
        if (g_outFD < 0) {  
            perror ("couldn't open output file");  
            exit(-1);  
        }  
  
        fstat(g_outFD, &statbuf);  
  
        g_outByteCount = statbuf.st_size;  
    }  
}  
如果我们在执行logcat命令时,指定了-f  <filename>选项,日志内容就输出到filename文件中,否则,就输出到标准输出控制台去了。
在logcat.cpp的main函数中,再接下来是对日志过滤器的初始话,然后就是打开日志设备文件了:
dev = devices;  
while (dev) {  
    dev->fd = open(dev->device, mode);  
    if (dev->fd < 0) {  
        fprintf(stderr, "Unable to open log device '%s': %s\n",  
            dev->device, strerror(errno));  
        exit(EXIT_FAILURE);  
    }  
  
    if (clearLog) {  
        int ret;  
        ret = Android::clearLog(dev->fd);  
        if (ret) {  
            perror("ioctl");  
            exit(EXIT_FAILURE);  
        }  
    }  
  
    if (getLogSize) {  
        int size, readable;  
  
        size = Android::getLogSize(dev->fd);  
        if (size < 0) {  
            perror("ioctl");  
            exit(EXIT_FAILURE);  
        }  
  
        readable = Android::getLogReadableSize(dev->fd);  
        if (readable < 0) {  
            perror("ioctl");  
            exit(EXIT_FAILURE);  
        }  
  
        printf("%s: ring buffer is %dKb (%dKb consumed), "  
               "max entry is %db, max payload is %db\n", dev->device,  
               size / 1024, readable / 1024,  
               (int) LOGGER_ENTRY_MAX_LEN, (int) LOGGER_ENTRY_MAX_PAYLOAD);  
    }  
  
    dev = dev->next;  
}  
如果执行logcat命令的目的是清空日志,即clearLog为true,则调用Android::clearLog函数来执行清空日志操作:
static int clearLog(int logfd)  
{  
    return ioctl(logfd, LOGGER_FLUSH_LOG);  
}  
这里是通过标准的文件函数ioctl函数来执行日志清空操作,具体可以参考logger驱动程序的实现。
如果执行logcat命令的目的是获取日志内存缓冲区的大小,即getLogSize为true,通过调用Android::getLogSize函数实现:
/* returns the total size of the log's ring buffer */  
static int getLogSize(int logfd)  
{  
    return ioctl(logfd, LOGGER_GET_LOG_BUF_SIZE);  
如果为负数,即size < 0,就表示出错了,退出程序。
 接着验证日志缓冲区可读内容的大小,即调用Android::getLogReadableSize函数:

/* returns the readable size of the log's ring buffer (that is, amount of the log consumed) */  
static int getLogReadableSize(int logfd)  
{  
    return ioctl(logfd, LOGGER_GET_LOG_LEN);  
}  
如果返回负数,即readable < 0,也表示出错了,退出程序。
接下去的printf语句,就是输出日志缓冲区的大小以及可读日志的大小到控制台去了。
继续往下看logcat.cppmain函数的代码,如果执行logcat命令的目的是清空日志或者获取日志的大小信息,则现在就完成使命了,可以退出程序了:
if (getLogSize) {  
    return 0;  
}  
if (clearLog) {  
    return 0;  
}  
否则,就要开始读取设备文件的日志记录了:
Android::readLogLines(devices);  
至此日志设备文件就打开并且初始化好了,下面,我们继续分析从日志设备文件读取日志记录的操作,即readLogLines函数。
  评论这张
 
阅读(653)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017