MTK抓log方法log机制以及如何抓取log

news2025/2/3 22:00:45

目录

离线log抓取:

adb命令打开mtklog的方法 :

实时log抓取:

设置log等级和打开平台log:

实时抓取,两种方式:

Kernel Log:

LOG 优先级

logcat


离线log抓取:

1.手机先进入开发者模式

2.进入拨号页面,输入*#*#3646633#*#*

3.右划进入log and debugging 选择debugloggerui,将除了第一个全部都关闭,只留下一个mobilelog,然后点击录制,在录制之前,记得把以前录制的log删除掉,在进行录制

4.adb pull data/debuglogger

(pull log需要完整路径:adb pull  /storage/emulated/0/debuglogger)

5.抓取的log存储在执行所在目录下。

adb命令打开mtklog的方法 :

adb shell am start -n com.debug.loggerui/com.debug.loggerui.MainActivity

实时log抓取:

设置log等级和打开平台log:

adb root
adb remount
adb shell setprop persist.vendor.mtk.camera.log_level 3 
adb shell setprop vendor.debug.mapping_mgr.enable 2
adb shell pkill camera*

实时抓取,两种方式:

adb logcat -G 30M;adb logcat -c ;adb logcat>~Downloads/test.txt

adb logcat -G 30M && adb logcat -c && adb logcat | grep -iE "ASD"

Kernel Log:


    在开发Linux device Driver或者跟踪调试内核行为的时候经常要通过Log API来trace整个过程,Kernel API printk() 是整个Kernel Log机制的基础API,几乎所有的Log方式都是基于printk来实现的。

利用printk,我们可以像开发C应用中printf接口一样印log,最简单的方式,我们只要把需要打印的内容传给printk函数就可以了,如下:

printk("This is just an example!!");

当然使用printk还有一些需要注意的地方,在详细讲述之前我们先分析一下printk()实现,其流程大致如下图所示:

从上图可以看出,printk的流程大致可以分为两步:

将所有Log输出到内核的Log buffer,该Log Buffer是一个循环缓冲区,其地址可以在内核中用log_buf变量访问。根据设定的Log级别决定是否将Log输出到Console。所以我们打印的log会走向两个位置:

  • Log Buffer,该Buffer的内容可以在user space通过/proc/kmsg来访问。
  • Console,Console的实现可以有很多,目前我们用到的有UART Console和RAM Console。拿UART Console来说,通向UART Console的log会在对应的UART端口打印出来。而RAM Console也是我们一种重要的Debug手段。

对于console log,不可避免的对系统的性能有损失,尤其是像UART Log这种收到硬件传输效率影响的。所以对于console log设置了两道关卡。第一个是对Log级别进行过滤,只能输出高优先级的log;第二个是为UART Console设置单独的开关,在不必要的时候可以将其关闭以提高系统性能。

在这里我们提到了Log Level的概念,那什么是Log Level呢?

LOG 优先级

Log Level,也叫做Log优先级,为了能够区分各个Log的重要程度,printk机制设计了若干Log级别以作区分。当我们读取log buffer (adb shell cat /proc/kmsg)的时候可以看到如下的log,在每一行Log的前面有一对尖角号,里面包含一个数字,这个数字即为这行Log优先级。

<6>[  641.908202] (0)[130:healthd]healthd: battery l=26 l2=50 v=3859 t=30.0 h=2

<4>[  641.908685] (0)[64:bat_thread_kthr][0x4]=0x9b [0x5]=0x4 [0x6]=0x70

<6>[  641.914564] (0)[130:healthd]healthd: battery l=26 l2=50 v=3859 t=30.0 h=2

<4>[  643.716514] (0)[0:swapper/0][printk_delayed:start]

<4>[  643.717113] (0)[0:swapper/0][WDK], local_bit:0x0, cpu:0,RT[643706704575]

<4>[  643.717120] (0)[0:swapper/0][WDK], local_bit:0x1, cpu:0, check bit0x:1,RT[6

<4>[  643.717127] (0)[0:swapper/0][WDK]: kick Ex WDT,RT[643706714498]

<4>[  643.717134] (0)[0:swapper/0][thread:86][RT:643706722652] 2013-01-01 00

<4>[  643.721143] (0)[0:swapper/0][printk_delayed:done]

<7>[  644.916496] (0)[0:swapper/0][ccci/ctl] (1)get_txpower(0): 16

<7>[  644.916520] (0)[0:swapper/0][ccci/ctl] (1)get_txpower(1): 16

<7>[  644.916540] (0)[0:swapper/0][ccci/ctl] (1)get_txpower(2): 16

<6>[  644.916663] (0)[96:flush-179:0][BLOCK_TAG] BDI_Flush statistic in timeline

<6>[  644.916682] (0)[96:flush-179:0][BLOCK_TAG] BDI_Flush [(PID):cnt] -- (  96

完整的8个级别的定义可以参考下表,值越小级别越高:

宏定义

级别

描述

KERN_EMERG

"<0>"

紧急信息,此信息会引起系统崩溃

KERN_ALERT

"<1>"

提示要马上采取某些行动

KERN_CRIT

"<2>"

关键信息,通常有严重的软件或者硬件问题发生了

KERN_ERR

"<3>"

通常用来报告错误,例如设备驱动通常会用来报告硬件操作失败等

KERN_WARNING

"<4>"

警告信息,用来警告那些并不会造成严重的系统异常的问题

KERN_NOTICE

"<5>"

用于正常但是值得注意的情况,比如大量安全相关的log

KERN_INFO

"<6>"

信息,许多驱动程序都会在硬件启动的时候使用这个级别打印Log

KERN_DEBUG

"<7>"

用于调试信息的打印

那优先级是怎么应用的呢?

我们可以为将要打印的log指定优先级,举例如下,可以在我们要打印的log前面简单的添加上Log优先级的宏定义即可,这个优先级在printk API里面会去解析处理,以判断是否要打印到console中去。

printk(KERN_ERR"This is an error message!!");

如果不指定优先级会怎样呢?

如果在印Log的时候不指定Log的优先级,printk会为这行Log采用默认的优先级。通常系统默认的优先级是4,即warning级别。

系统默认的优先级可以通过读取/proc文件来得到,如下所示,其中读回来的第2个参数即为未指定Log Level的时候printk默认的Log级别。

D:\>adb shell cat /proc/sys/kernel/printk

6       4       1       6                

/proc/sys/kernel/printk里面的参数意义是什么?

前面我们使用cat读取了/proc/sys/kernel/printk里面的内容,读取的这4个数字的含义分别是:

第一个参数表示console log level,即只有优先级大于这个级别的Log才可以打印到Console。
第二个参数表示默认Log级别,即打印Log未明确指定Log level的时候默认采用的Log级别。
第三个参数表示最小可用的Log Level,用于do_syslog()系统调用。
第四个参数表示默认的Console Log Level,未找到使用的地方。
Console Log 输出控制

从前面的图例以及讲述都有提到,console_loglevel 决定了哪些级别的log可以输出到console。而console_loglevel的值可以通过 /proc/sys/kernel/printk 来读取出来。

除此之外,我们还可以通过/proc/sys/kernel/printk设置console_loglevel来达到控制 console log 输出的目的,方法如下(修改这个参数需要有root权限):

D:\>adb shell cat /proc/sys/kernel/printk        

6       4       1       6                        

D:\>adb shell "echo 8 > /proc/sys/kernel/printk" 

D:\>adb shell cat /proc/sys/kernel/printk        

8       4       1       6                        

上面黄色一行命令将console_loglevel设置8,即所有级别的log(因为定义的最低优先级的Log Level是7)都可以输出到console。当然通过这个命令也可以禁止一些低优先级的log输出到console,只要将console_loglevel的值设置小一些即可。

UART Console 的控制

对于UART Console单独设置了开关主要是因为其对系统性能的影响比较大,因为UART Console是同步的方式通过硬件以固定的传输速率印Log,如果Log量比较大的时候,印Log不可避免会花费系统较多的时间,这样就会引起较多的Performance问题,如UI卡顿等。另外由于往UART Console印Log会关闭中断,严重的时候可能会引起系统无法响应或者重启。

也正因为此,我们在user版本上面默认是关闭UART Console Log的。

那么如何在runtime控制UART Console 的打开和关闭呢?可以使用如下命令(执行该命令需要有root权限):

D:\>adb shell "echo 1 > /sys/module/printk/parameters/disable_uart"  

D:\>adb shell "echo 0 > /sys/module/printk/parameters/disable_uart"  

通过将disable_uart参数设置为1来关闭UART Console,反之通过将disable_uart参数设置为0来打开UART Console。

logcat


Logcat 是 Android SDK 里面提供的命令行下的 Logging 工具,用法简单,使用方便,相关的介绍可以参考 Android Developer 链接: http://developer.android.com/tools/help/logcat.html

用法

命令格式如下,在<option>可以指定一些选项,比如输出格式,指定 buffer 等;而在<filter-spec>中可以指定过滤规则。

[adb] logcat [<option>] ... [<filter-spec>] ...

logcat 可以作为 adb command 来执行,利用 target 上面的 adb daemon 来操作 log buffer。

adb logcat -v threadtime

也可以通过 adb 建立的 shell,在 shell 里面执行 target 上面的 logcat 程序来操作 log buffer。

adb shell logcat -v threadtime

常用操作

详细的使用方式请参考 Android Developer 上面的介绍,这里仅对常用操作进行举例。

如何抓取有效 log?
adb logcat -v threadtime > main_log.txt

此种方式为最常用的抓取方式,会将 log 的 PID,TID,TAG 以及时间戳都打印在一行 log 里面。优先使用此种方式抓取 log,一定不要仅仅敲 adb logcat 来抓取 log,adb logcat 仅仅会将一些基本的信息打印出来,缺少时间戳信息对于分析问题是困难的。

如何仅仅抓取某个 TAG 的 Log?
可以使用<filter-spec>来过滤某一些 log,<filter-spec>的格式是 <TAG>:<Priority>.

adb logcat -v threadtime ActivityManager:D *:S

上面的命令可以仅打印 ActivityManager 等于和高于 debug 级别的log,它指定了 ActivityManager 最低 Log 级别为 debug,用 * 来匹配其他所有 TAG,并将其它所有 TAG 设置为 silent 级别,即不输出任何 Log。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2268432.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

人工智能与云计算的结合:如何释放数据的无限潜力?

引言&#xff1a;数据时代的契机 在当今数字化社会&#xff0c;数据已成为推动经济与技术发展的核心资源&#xff0c;被誉为“21世纪的石油”。从个人消费行为到企业运营决策&#xff0c;再到城市管理与国家治理&#xff0c;每个环节都在生成和积累海量数据。然而&#xff0c;数…

如何在 Ubuntu 22.04 上安装 Varnish HTTP 教程

简介 在本教程中&#xff0c;我们将学习如何在 Ubuntu 22.04 服务器上安装和配置 Varnish HTTP。 Varnish 是一款高性能的 HTTP 加速器&#xff0c;旨在提高内容密集型动态网站的速度。它通过将网页缓存在内存中来工作&#xff0c;从而减少 Web 服务器的负载&#xff0c;并显…

AI辅助编码提高病案首页主要诊断编码正确率数据优化方法(2025增量优化版附python源代码)

一、引言 1.1 研究背景与意义 在医疗信息化进程中,病案首页作为病历信息的核心浓缩,承载着疾病分类、医疗统计、医保结算等关键任务,其主要诊断编码的准确性至关重要。准确的编码不仅是医疗质量评估、科研数据分析的基石,更是合理分配医疗资源、保障医保精准支付的关键依…

CSES-1135 Distance Queries

题目传送门https://vjudge.net/problem/CSES-1135#authorGPT_zh 解题思路 题目让我们求树上两个点的距离。 那么就可以转化为两点到其 LCA 的距离之和。 代码 #include<bits/stdc.h> using namespace std;int n,q; vector<int> g[200001]; int dis[200001],dep…

「Mac畅玩鸿蒙与硬件49」UI互动应用篇26 - 数字填色游戏

本篇教程将带你实现一个数字填色小游戏&#xff0c;通过简单的交互逻辑&#xff0c;学习如何使用鸿蒙开发组件创建趣味性强的应用。 关键词 UI互动应用数字填色动态交互逻辑判断游戏开发 一、功能说明 数字填色小游戏包含以下功能&#xff1a; 数字选择&#xff1a;用户点击…

001__VMware软件和ubuntu系统安装(镜像)

[ 基本难度系数 ]:★☆☆☆☆ 一、Vmware软件和Ubuntu系统说明&#xff1a; a、Vmware软件的说明&#xff1a; 官网&#xff1a; 历史版本&#xff1a; 如何下载&#xff1f; b、Ubuntu系统的说明&#xff1a; 4、linux系统的其他版本&#xff1a;红旗(redhat)、dibian、cent…

【NebulaGraph】变化的多跳查询

【NebulaGraph】变化的多跳查询 1. 需求2. 解决方案2.1 确定查询结构2.2 构建查询语句 3. 追加需求&#xff1a;如果增加每一跳都要指定查询某SPACE下的Tag&#xff0c;或者不查询某个Tag怎么办 1. 需求 存在多跳请求&#xff0c;其中每一跳是从上一跳查询结果为基础的。但是 …

【Compose multiplatform教程06】用IDEA编译Compose Multiplatform常见问题

当我们从Kotlin Multiplatform Wizard | JetBrains 下载ComposeMultiplatform项目时 会遇到无法正常编译/运行的情况&#xff0c;一般网页和桌面是可以正常编译的&#xff0c; 我这里着重解决如下问题 1:Gradle版本不兼容或者Gradle连接超时 2:JDK版本不兼容 3:Gradle依赖库连…

如何利用无线路由器实现水泵房远程监测管理

水泵站广泛部署应用在工农业用水、防洪、排涝和抗旱减灾等方面&#xff0c;如果水泵站发生异常&#xff0c;往往会对生产生活造成诸多损失&#xff0c;甚至引发安全事故。因此&#xff0c;建立一套高效、可靠的泵站远程监测管理系统至关重要。 方案背景 目前&#xff0c;我国大…

vue3学习笔记(9)-pinia、storeToRefs、getters

1.新的集中式状态&#xff08;数据&#xff09;管理库&#xff0c;redux vuex pinia 搭建 2.ref拆包 如果在reactive里面定义ref&#xff0c;则打印c时&#xff0c;无需.value 他自动拆包&#xff0c;如果直接在外面定义的ref则需要.value,他没有拆包 3.pinia存储读取数据 存…

【Qt】容器控件、布局管理控件

目录 容器控件 QGroupBox QTabWidget 布局管理控件 QVBoxLayout 例子&#xff1a; QHBoxLayout 例子&#xff1a; QGridLayout 例子&#xff1a; 例子&#xff1a; QFormLayout 例子&#xff1a; QSpacerItem 例子&#xff1a; 容器控件 QGroupBox 表示一个带有…

计算机的错误计算(一百九十六)

摘要 用两个大模型计算 arccos(0.444). 结果保留 4位有效数字。两个大模型的计算结果相同&#xff0c;并均有误差。 例1. 计算 arccos(0.444). 结果保留 4位有效数字。 下面是与一个大模型的对话。 以上为与一大模型的对话。 下面是与另一大模型的对话。 点评&#xff1a; &…

Unity开发微信小游戏踩坑总结

前言 不记录真记不住&#xff0c;这个帖子以后不定时更新。 问题1&#xff1a;图片模糊 问题描述&#xff1a; 在Unity里什么事没有&#xff0c;进入到微信开发者工具里就已经模糊了&#xff0c;人物动画是一团马赛克&#xff0c;图片看着倒是没事。 问题原因&#xff1a;…

Python爬虫教程——7个爬虫小案例(附源码)_爬虫实例

本文介绍了7个Python爬虫小案例&#xff0c;包括爬取豆瓣电影Top250、猫眼电影Top100、全国高校名单、中国天气网、当当网图书、糗事百科段子和新浪微博信息&#xff0c;帮助读者理解并实践Python爬虫基础知识。 包含编程资料、学习路线图、源代码、软件安装包等&#xff01;【…

kafka小实站

需要先在前面的文章里面照着下载好kafka&#xff0c;并且启动 先启动zookeeper 项目目录 package kafka; import lombok.extern.slf4j.Slf4j; import org.apache.kafka.clients.consumer.ConsumerRecord; import org.springframework.kafka.annotation.KafkaListener; import…

【从零开始入门unity游戏开发之——C#篇39】C#反射使用——Type 类、Assembly 类、Activator 类操作程序集

文章目录 前言一、前置知识1、编译器2、程序集&#xff08;Assembly&#xff09;3、元数据&#xff08;Metadata&#xff09; 二、反射1、反射的概念2、反射的作用3、反射的核心Type 类3.1 Type 类介绍3.2 不同方法获取 Type3.3 获取type类型所在的程序集的相关信息 4、反射的常…

(桌面运维学习)通过备份C盘,进行Windows系统的软件初始化

通过PE工具备份C盘&#xff0c;进行Windows系统的软件初始化 需求场景&#xff1a;快速初始化一批型号和主板一样的电脑系统型号也要一致&#xff08;Win10专业版就最好全是WIn10专业版&#xff09;&#xff0c;初始化的内容包括已配置好的环境和已安装的软件。主要用于公司桌面…

【ELK】ES单节点升级为集群模式--太细了!

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言准备工作1. 查看现状【单节点】2. 原节点改集群模式3. 改es配置文件&#xff0c;增加集群相关配置项4. *改docker映射的端口* 启动新节点5. docker-compose起一…

Path-of-Thoughts:将“思维链“升级为“思维图“,三阶段框架取代单一推理,提升大模型复杂关系推理准确性至88.2%与效率提升5%

Path-of-Thoughts&#xff1a;将"思维链"升级为"思维图"&#xff0c;三阶段框架取代单一推理&#xff0c;提升大模型复杂关系推理准确性至88.2%与效率提升5% 论文大纲理解通用流程框架 观察和假设观察现象提出假设实验验证解法拆解解法&#xff1a;Path-of…

ThinkPHP 8高效构建Web应用-第一个简单的MVC应用示例

【图书介绍】《ThinkPHP 8高效构建Web应用》-CSDN博客 《2025新书 ThinkPHP 8高效构建Web应用 编程与应用开发丛书 夏磊 清华大学出版社教材书籍 9787302678236 ThinkPHP 8高效构建Web应用》【摘要 书评 试读】- 京东图书 使用VS Code开发ThinkPHP项目-CSDN博客 我们先实现一…