热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

adb查看内核LOG信息

在调试内核的时候,如果用串口总要费县到串口,如果能直接用adblogcat命令就好了,插上USB就可以了,也省去了飞线的步骤:如何才能实现呢,经过搜索找到了如下的方法:更改logcat.cpp文件
在调试内核的时候,如果用串口总要费县到串口,如果能直接用adb logcat 命令就好了,插上USB就可以了,也省去了飞线的步骤:


如何才能实现呢,经过搜索找到了如下的方法:


更改logcat.cpp文件:


第一步:添加头文件 #include //add 


第二步:添加宏 #define KERNEL_TAG "Kernel"


第三部:修改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 }; // 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(); 
                     
                    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(); 
                             
                            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) { 
                // 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: 
        ; 
    } 



第四步:连接USB 进入调试模式,打开终端 输入命令 adb logcat


此时在内核中用函数PRINTK输出的TRACE就能打印出来了,


如何治显示内核部分的LOG呢,可以用命令


adb logcat -s Kernel


-s参数说明只显示包含LOG_TAG 为Kernel的,这样就只显示内核LOG了
推荐阅读
  • STM32 IO口模拟串口通讯
    转自:http:ziye334.blog.163.comblogstatic224306191201452833850647前阵子,调项目时需要用到低波 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • 模板引擎StringTemplate的使用方法和特点
    本文介绍了模板引擎StringTemplate的使用方法和特点,包括强制Model和View的分离、Lazy-Evaluation、Recursive enable等。同时,还介绍了StringTemplate语法中的属性和普通字符的使用方法,并提供了向模板填充属性的示例代码。 ... [详细]
  • 基于Socket的多个客户端之间的聊天功能实现方法
    本文介绍了基于Socket的多个客户端之间实现聊天功能的方法,包括服务器端的实现和客户端的实现。服务器端通过每个用户的输出流向特定用户发送消息,而客户端通过输入流接收消息。同时,还介绍了相关的实体类和Socket的基本概念。 ... [详细]
  • 本文介绍了在MFC下利用C++和MFC的特性动态创建窗口的方法,包括继承现有的MFC类并加以改造、插入工具栏和状态栏对象的声明等。同时还提到了窗口销毁的处理方法。本文详细介绍了实现方法并给出了相关注意事项。 ... [详细]
  • 本文介绍了使用C++Builder实现获取USB优盘序列号的方法,包括相关的代码和说明。通过该方法,可以获取指定盘符的USB优盘序列号,并将其存放在缓冲中。该方法可以在Windows系统中有效地获取USB优盘序列号,并且适用于C++Builder开发环境。 ... [详细]
  • 该楼层疑似违规已被系统折叠隐藏此楼查看此楼*madebyebhrz*#include#include#include#include#include#include#include ... [详细]
  • JavaSE笔试题-接口、抽象类、多态等问题解答
    本文解答了JavaSE笔试题中关于接口、抽象类、多态等问题。包括Math类的取整数方法、接口是否可继承、抽象类是否可实现接口、抽象类是否可继承具体类、抽象类中是否可以有静态main方法等问题。同时介绍了面向对象的特征,以及Java中实现多态的机制。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 本文介绍了Perl的测试框架Test::Base,它是一个数据驱动的测试框架,可以自动进行单元测试,省去手工编写测试程序的麻烦。与Test::More完全兼容,使用方法简单。以plural函数为例,展示了Test::Base的使用方法。 ... [详细]
  • 本文探讨了C语言中指针的应用与价值,指针在C语言中具有灵活性和可变性,通过指针可以操作系统内存和控制外部I/O端口。文章介绍了指针变量和指针的指向变量的含义和用法,以及判断变量数据类型和指向变量或成员变量的类型的方法。还讨论了指针访问数组元素和下标法数组元素的等价关系,以及指针作为函数参数可以改变主调函数变量的值的特点。此外,文章还提到了指针在动态存储分配、链表创建和相关操作中的应用,以及类成员指针与外部变量的区分方法。通过本文的阐述,读者可以更好地理解和应用C语言中的指针。 ... [详细]
  • 本文讨论了在VMWARE5.1的虚拟服务器Windows Server 2008R2上安装oracle 10g客户端时出现的问题,并提供了解决方法。错误日志显示了异常访问违例,通过分析日志中的问题帧,找到了解决问题的线索。文章详细介绍了解决方法,帮助读者顺利安装oracle 10g客户端。 ... [详细]
  • 微信官方授权及获取OpenId的方法,服务器通过SpringBoot实现
    主要步骤:前端获取到code(wx.login),传入服务器服务器通过参数AppID和AppSecret访问官方接口,获取到OpenId ... [详细]
  • 在本教程中,我们将看到如何使用FLASK制作第一个用于机器学习模型的RESTAPI。我们将从创建机器学习模型开始。然后,我们将看到使用Flask创建AP ... [详细]
author-avatar
mobiledu2502909383
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有