Kernel space lock contention配置及其使用

本文详细介绍Linux内核中锁调试的配置与使用,包括lock contention的跟踪、lock trace event的捕获及proc节点信息的解析,为解决锁竞争和死锁问题提供有效手段。
概述

本文涉及到的内容如下:

  1. kernel lock相关debug方式,比如lock耗时,拿不到lock,lock依赖等等
  2. trace的使用
1.开启lock contenttion涉及到的config配置
config LOCKDEP  
        bool  
        depends on DEBUG_KERNEL && TRACE_IRQFLAGS_SUPPORT && STACKTRACE_SUPPORT && LOCKDEP_SUPPORT  
        select STACKTRACE  
        select FRAME_POINTER if !MIPS && !PPC && !ARM_UNWIND && !S390 && !MICROBLAZE && !ARC && !SCORE && !X86  
        select KALLSYMS  
        select KALLSYMS_ALL  
  
config LOCKDEP_SMALL  
        bool  
  
config LOCK_STAT  
        bool "Lock usage statistics"  
        depends on DEBUG_KERNEL && TRACE_IRQFLAGS_SUPPORT && STACKTRACE_SUPPORT && LOCKDEP_SUPPORT  
        select LOCKDEP  
        select DEBUG_SPINLOCK  
        select DEBUG_MUTEXES  
        select DEBUG_RT_MUTEXES if RT_MUTEXES  
        select DEBUG_LOCK_ALLOC  
        default n  
        help  
         This feature enables tracking lock contention points  
  
         For more details, see Documentation/locking/lockstat.txt  
  
         This also enables lock events required by "perf lock",  
         subcommand of perf.  
         If you want to use "perf lock", you also need to turn on  
         CONFIG_EVENT_TRACING.  
  
         CONFIG_LOCK_STAT defines "contended" and "acquired" lock events.  
         (CONFIG_LOCKDEP defines "acquire" and "release" events.)  

上面的config默认是关闭状态。

2 menuconfig开启config配置

kernel hacking —> Lock Debugging (spinlock, mutexs, etc…) —>进入之后勾选
Lock Debugging: detect incorrect freeing of live locks 和Lcok usage statistics,就会把依赖项自动勾选.
在这里插入图片描述

保存退出之后,可以查看kernel下面新产生的config diff文件:

# Lock Debugging (spinlocks, mutexes, etc...)  
 #  
-# CONFIG_DEBUG_RT_MUTEXES is not set  
-# CONFIG_DEBUG_SPINLOCK is not set  
-# CONFIG_DEBUG_MUTEXES is not set  
+CONFIG_DEBUG_RT_MUTEXES=y  
+CONFIG_DEBUG_SPINLOCK=y  
+CONFIG_DEBUG_MUTEXES=y  
 # CONFIG_DEBUG_WW_MUTEX_SLOWPATH is not set  
-# CONFIG_DEBUG_LOCK_ALLOC is not set  
+CONFIG_DEBUG_LOCK_ALLOC=y  
 # CONFIG_PROVE_LOCKING is not set  
-# CONFIG_LOCK_STAT is not set  
+CONFIG_LOCKDEP=y  
+CONFIG_LOCK_STAT=y  
+# CONFIG_DEBUG_LOCKDEP is not set  
 # CONFIG_DEBUG_ATOMIC_SLEEP is not set  
 # CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set  
 # CONFIG_LOCK_TORTURE_TEST is not set  

这样开启lock trace event了.。编译boot并刷机即可!

3 确定是否开启trace lock content feature

上面步骤二中开启之后,在adb shell里面多了如下几个接口:

  1. 增加了lock trace event, 有四个lock trace event,具体做什么使用,下面在详细讲解
    在这里插入图片描述
  2. 增加了lock的统计信息, 节点信息实现源码kernel/locking/lockdep_proc.c文件中:
    ● lock_stat: 统计各种类型lock的时延
    ● lockdep: 表示锁的的深度,即一个lock里面调用了多少个lock,并将这些lock的调用全部显示出来
    ● lockdep_stats: 即锁深度里面包含了哪些lock以及频次
    ● locks:锁的状态,这个实现在fs/locks.c文件里面

在这里插入图片描述

4 如何使用lock trace event和proc node信息
4.1 lock trace event

从第三部分可以知道,lock trace event包含四个event,分别讲解如下:
四个event定义在include/trace/event/lock.h里面, 使用在kernel/locking/lockdep.c文件,

  1. lock_acquire: 获取lock,比如mutex lock ,rcu read lock 或者spinlock等等lock
  2. lock_acquired: 表示已经获取lock了
  3. lock_release: lock释放的event
  4. lock_contended: lock被谁hold了

那么如何抓取lock相关的trace event呢?
可以使用下面的脚本抓取(必须添加lock event ),即正常的抓取trace 命令:

echo 40000 > buffer_size_kb && echo irq sched_switch sched_wakeup sched_waking cpu_frequency cpu_idle lock > set_event && cat set_event && echo > trace  && echo 1 > tracing_on && sleep 10 && echo 0 > tracing_on && cat trace > /data/trace.txt   

脚本执行完毕之后, pull出data目录下的trace.txt文件,vim打开即可看到下面类似的信息:

┊   ┊  sleep-2875  [004] d.s2   748.861607: sched_waking: comm=rcu_sched pid=9 prio=120 target_cpu=000  
┊   ┊  sleep-2875  [004] d.s3   748.861608: lock_acquire: 00000000d4eff177 &rq->lock  
┊   ┊  sleep-2875  [004] d.s3   748.861609: lock_contended: 00000000d4eff177 &rq->lock  
┊   ┊  sleep-2875  [004] d.s3   748.861662: lock_acquired: 00000000d4eff177 &rq->lock  
┊   ┊  sleep-2875  [004] d.s3   748.861663: lock_acquire: 000000000ff04d65 read tk_core.seq  
┊   ┊  sleep-2875  [004] d.s3   748.861664: lock_release: 000000000ff04d65 tk_core.seq  
┊   ┊  sleep-2875  [004] d.s3   748.861666: lock_acquire: 00000000cc726398 read rcu_read_lock  
┊   ┊  sleep-2875  [004] d.s3   748.861667: lock_release: 00000000cc726398 rcu_read_lock  
┊   ┊  sleep-2875  [004] d.s3   748.861668: lock_release: 00000000d4eff177 &rq->lock  
┊   ┊  sleep-2875  [004] d.s2   748.861669: lock_acquire: 00000000cc726398 read rcu_read_lock  
┊   ┊  sleep-2875  [004] d.s2   748.861670: lock_acquire: 00000000cc726398 read rcu_read_lock  
┊   ┊  sleep-2875  [004] d.s2   748.861671: lock_release: 00000000cc726398 rcu_read_lock  
┊   ┊  sleep-2875  [004] d.s2   748.861672: lock_acquire: 00000000cc726398 read rcu_read_lock  
┊   ┊  sleep-2875  [004] d.s2   748.861673: lock_release: 00000000cc726398 rcu_read_lock  
┊   ┊  sleep-2875  [004] d.s2   748.861674: lock_acquire: 00000000cc726398 read rcu_read_lock  
┊   ┊  sleep-2875  [004] d.s2   748.861675: lock_release: 00000000cc726398 rcu_read_lock  
┊   ┊  sleep-2875  [004] d.s2   748.861676: lock_acquire: 00000000cc726398 read rcu_read_lock  
┊   ┊  sleep-2875  [004] d.s2   748.861677: lock_release: 00000000cc726398 rcu_read_lock  
┊   ┊  sleep-2875  [004] d.s2   748.861678: lock_acquire: 00000000cc726398 read rcu_read_lock  
┊   ┊  sleep-2875  [004] d.s2   748.861679: lock_release: 00000000cc726
那中间怎么漏了这么多时间,不是有问题吗? yuanhaixiong@yuanhaixiong-PC:~/machine/Log/#K1-8G-KASAN版本monkey异常停止0806/debuglogger/mobilelog$ ls APLog_2025_0806_173133__3 APLog_2025_0807_065857__5 APLog_2025_0807_080020__7 APLog_2025_0807_112654__9 APLog_2025_0807_130603__11 APLog_2025_0807_134712__13 APLog_2025_0807_153818__15 APLog_2025_0807_042752__4 APLog_2025_0807_073742__6 APLog_2025_0807_111445__8 APLog_2025_0807_121702__10 APLog_2025_0807_134043__12 APLog_2025_0807_150142__14 file_tree.txt yuanhaixiong@yuanhaixiong-PC:~/machine/Log/#K1-8G-KASAN版本monkey异常停止0806/debuglogger/mobilelog$ tail APLog_2025_0807_150142__14/ atf_log_8__2025_0807_151258 crash_log_6__2025_0807_151258 main_log_1__2025_0807_151029 pl_lk sspm_log_12__2025_0807_151258 bootprof events_log_4__2025_0807_151258 main_log_2__2025_0807_151258 properties sys_log_5__2025_0807_151258 bsp_log_10__2025_0807_151258 gz_log_9__2025_0807_151258 mblog_history radio_log_3__2025_0807_151258 connsys_picus_log_14__2025_0807_151258 kernel_log_7__2025_0807_151258 mcupm_log_13__2025_0807_151258 scp_log_11__2025_0807_151258 yuanhaixiong@yuanhaixiong-PC:~/machine/Log/#K1-8G-KASAN版本monkey异常停止0806/debuglogger/mobilelog$ tail APLog_2025_0807_150142__14/main_log_2__2025_0807_151258 08-07 15:12:58.266055 1388 1388 D BufferQueueConsumer: [](id:56c00000a64,api:0,p:-1,c:1388) connect: controlledByApp=false 08-07 15:12:58.267110 1388 1388 D BLASTBufferQueue: [VRI[0 fl=}]#2576](f:0,a:0) constructor() 08-07 15:12:58.267446 1388 1388 D BLASTBufferQueue: [VRI[0 fl=}]#2576](f:0,a:0) update width=1080 height=2412 format=-2 mTransformHint=0 08-07 15:12:58.268282 1478 1671 I PowerHalWrapper: amsBoostNotify pid:24443,activity:com.android.searchlauncher.SearchLauncher, package:com.android.launcher3, mProcessCreatePackcom.google.android.apps.safetyhub 08-07 15:12:58.268479 1478 1671 I PowerHalWrapper: state: 1 08-07 15:12:58.269953 1478 1671 I mtkpower_client: [PowerHal_Wrap_notifyAppState] com.android.launcher3/com.android.searchlauncher.SearchLauncher pid=24443 activityId:211372178 state:1 08-07 15:12:58.270392 1478 1671 I mtkpower_client: [Legacy][PowerHal_Wrap_notifyAppState] com.android.launcher3/com.android.searchlauncher.SearchLauncher pid=24443 state:211372178 08-07 15:12:58.271280 6355 6355 I Monkey : :Sending Touch (ACTION_DOWN): 0:(638.0,2182.0) 08-07 15:12:58.271369 1388 1388 I cioz : (REDACTED) onApplyWindowInsets: systemWindowInsets=%s 08-07 15:12:58.271549 897 954 I libPowerHal: [perfNotifyAppState] pack:com.android.launcher3, act:com.android.searchlauncher.SearchLauncher, state:1, pid:24443, uid:1000, fps:-1 yuanhaixiong@yuanhaixiong-PC:~/machine/Log/#K1-8G-KASAN版本monkey异常停止0806/debuglogger/mobilelog$ ls APLog_2025_0806_173133__3 APLog_2025_0807_065857__5 APLog_2025_0807_080020__7 APLog_2025_0807_112654__9 APLog_2025_0807_130603__11 APLog_2025_0807_134712__13 APLog_2025_0807_153818__15 APLog_2025_0807_042752__4 APLog_2025_0807_073742__6 APLog_2025_0807_111445__8 APLog_2025_0807_121702__10 APLog_2025_0807_134043__12 APLog_2025_0807_150142__14 file_tree.txt yuanhaixiong@yuanhaixiong-PC:~/machine/Log/#K1-8G-KASAN版本monkey异常停止0806/debuglogger/mobilelog$ head APLog_2025_0807_153818__15/ atf_log_7__2025_0807_155133 crash_log_5__2025_0807_155133 main_log_1__2025_0807_155133 properties sys_log_4__2025_0807_155133 bootprof events_log_3__2025_0807_155133 mblog_history radio_log_2__2025_0807_155133 bsp_log_9__2025_0807_155133 gz_log_8__2025_0807_155133 mcupm_log_12__2025_0807_155133 scp_log_10__2025_0807_155133 connsys_picus_log_13__2025_0807_155133 kernel_log_6__2025_0807_155133 pl_lk sspm_log_11__2025_0807_155133 yuanhaixiong@yuanhaixiong-PC:~/machine/Log/#K1-8G-KASAN版本monkey异常停止0806/debuglogger/mobilelog$ head APLog_2025_0807_153818__15/main_log_1__2025_0807_155133 ----- timezone:Asia/Shanghai 08-07 15:37:42.020551 1899 1899 D BLASTBufferQueue: [VRI[VolumeDialogImpl]#20808](f:0,a:0) constructor() 08-07 15:37:42.020644 1899 1899 D BLASTBufferQueue: [VRI[VolumeDialogImpl]#20808](f:0,a:0) update width=192 height=1584 format=-2 mTransformHint=0 08-07 15:37:42.022698 1899 2022 D BufferQueueProducer: [VRI[VolumeDialogImpl]#20808(BLAST Consumer)20808](id:76b000051cf,api:1,p:1899,c:1899) connect: api=1 producerControlledByApp=true 08-07 15:37:42.038344 1899 2022 D BLASTBufferQueue: [VRI[VolumeDialogImpl]#20808](f:0,a:1) acquireNextBufferLocked size=192x1584 mFrameNumber=1 applyTransaction=true mTimestamp=80052119459001(auto) mPendingTransactions.size=0 graphicBufferId=8156143212544 transform=0 08-07 15:37:42.039933 934 986 E surfaceflinger: == MALI DEBUG ===eglp_winsys_populate_image_templates ==12288 08-07 15:37:42.049390 1478 1606 E system_server: No package ID ff found for resource ID 0xffffffff. 08-07 15:37:42.058021 934 1710 I BufferQueueDebug: [Surface(name=e81a44d VolumeDialogImpl)/@0x36c1005 - animation-leash of window_animation#399493](this:0xb40000777fcdb730,id:-1,api:0,p:-1,c:-1) BufferQueue core=(934:/system/bin/surfaceflinger) 08-07 15:37:42.067688 1899 1899 D BLASTBufferQueue: [VRI[VolumeDialogImpl]#20808](f:0,a:1) update width=192 height=1392 format=-2 mTransformHint=0 08-07 15:37:42.069336 1899 2022 D BufferQueueProducer: [VRI[VolumeDialogImpl]#20808(BLAST Consumer)20808](id:76b000051cf,api:1,p:1899,c:1899) disconnect: api 1 yuanhaixiong@yuanhaixiong-PC:~/machine/Log/#K1-8G-KASAN版本monkey异常停止0806/debuglogger/mobilelog$
08-21
<think>我们正在分析Android系统日志(APLog)中时间间隔异常的问题。用户发现日志文件的时间戳存在间隔(例如从0807_042752直接跳到0807_065857),怀疑系统或日志记录过程中出现了异常。我们将结合引用内容,特别是引用[1]中关于待机功耗的分析方法和引用[2]中ANR问题的分析流程,来排查可能的原因。 根据引用[1],待机时功耗偏高可能是因为系统被频繁唤醒或长期睡不下去,而这类问题大部分不会有MDlog(即Modem日志),需要依靠AP log来挖掘线索。引用[2]则提供了ANR问题的分析流程,主要关注主线程的状态和窗口焦点等。 针对日志时间间隔异常,我们考虑以下几个方向: 1. 系统休眠状态:系统进入休眠时,日志记录可能暂停,导致时间间隔。 2. 系统异常(如死锁、ANR):系统可能因为某些原因无法唤醒或长时间阻塞,导致日志记录中断。 3. 日志服务异常:日志记录服务本身可能发生崩溃或阻塞。 4. 存储问题:存储空间不足或I/O阻塞导致日志写入失败。 具体排查步骤: 步骤1:确认日志间隔期间系统状态 - 检查日志间隔的开始和结束时间点附近的日志,寻找系统休眠和唤醒的证据。 - 查找关键字:`PowerManagerService`、`Screen off`、`Screen on`、`wakeup reason`等。 - 例如,在引用[1]中提到,待机时系统被频繁唤醒或长期睡不下去,需要看谁在持锁(wake lock)以及唤醒源。因此,我们可以检查日志中是否有长时间持锁的wake lock,或者频繁的唤醒源。 步骤2:检查ANR或死锁 - 根据引用[2]的ANR分析流程,如果在日志间隔后紧接着出现ANR,那么需要分析ANR的原因。特别是检查主线程的状态,以及是否有窗口焦点丢失等问题。 - 在日志中搜索关键字“ANR”、“Input dispatching timed out”、“Broadcast of”等。 - 检查trace文件(如果有的话),查看主线程的堆栈,看是否阻塞在某个操作上。 步骤3:检查日志服务状态 - 在日志中搜索与日志服务相关的进程(如`logd`、`mobilelog_d`等)是否有异常重启或错误信息。 - 检查日志中是否有关于日志写入失败的错误(如I/O错误)。 步骤4:检查存储状态 - 检查日志间隔期间是否有存储空间不足的报错(如“No space left on device”)。 - 检查是否有文件系统错误(如“I/O error”)。 步骤5:结合其他日志 - 查看同一时间段的kernel log,是否有硬件错误(如eMMC错误)或内核panic。 - 查看系统服务日志(如`system_server`)是否有异常。 示例分析: 假设我们在日志间隔后的第一个日志文件(如`APLog_2025_0807_065857__5`)中发现了以下内容: ``` 08-07 06:58:57.123456 1000 1000 E PowerManagerService: Wake lock MyWakeLock held for over 5 hours! 08-07 06:58:57.123789 1000 1000 I PowerManagerService: Going to sleep by user request... 08-07 06:58:57.124567 1000 1000 D PowerManagerService: Screen off timeout: 10000ms ``` 这表明在间隔期间有一个WakeLock被长时间持有,导致系统无法进入深度睡眠,但日志记录可能因为系统处于低功耗状态而减少。 又或者,我们发现了ANR的痕迹: ``` 08-07 06:58:57.123456 1000 1000 E ActivityManager: ANR in com.example.app (com.example.app/.MainActivity) 08-07 06:58:57.123456 1000 1000 E ActivityManager: Reason: Input dispatching timed out (com.example.app/com.example.app.MainActivity, 5000ms) ``` 那么我们就需要按照引用[2]中的ANR分析流程,检查主线程堆栈和窗口焦点等。 如果没有发现明显的错误,并且间隔期间系统处于休眠状态,那么日志间隔可能是正常的。 总结:日志时间间隔并不一定代表异常,需要结合系统状态和日志内容综合分析。 下面,我们根据用户提供的日志片段进行初步分析: 用户提供的日志片段1(APLog_2025_0807_150142__14/main_log_2__2025_0807_151258): - 最后几行是正常的Monkey测试事件(发送触摸事件)和一些系统服务日志(PowerHal等)。 日志片段2(APLog_2025_0807_153818__15/main_log_1__2025_0807_155133): - 开头是VolumeDialogImpl相关的日志,显示在15:37:42开始记录。 这两个日志文件的时间间隔大约是25分钟(从15:12:58到15:37:42)。我们需要检查这25分钟内系统发生了什么。 但是,用户提供的日志片段中并没有直接包含间隔期间的内容。因此,我们只能根据已有的信息推测: 1. 如果在这25分钟内系统处于休眠状态(比如用户按了电源键关闭屏幕),那么日志记录暂停是正常的。 2. 如果系统在这段时间内发生了崩溃(如kernel panic)或重启,那么日志会出现中断,并且在重启后生成新的日志文件。但用户提供的日志文件是连续的(从__3到__15),没有明显的重启痕迹(因为重启后日志序号会重新开始?这里需要看日志命名规则,但用户提供的日志序号是连续的,所以可能没有重启)。 3. 可能发生了ANR或死锁,导致系统无法响应,日志服务也无法记录。但如果没有生成ANR日志,则难以确认。 因此,建议用户检查间隔时间段内是否有对应的ANR日志(/data/anr/)或者崩溃日志(/data/tombstones/),以及查看kernel log是否有异常。 另外,用户提到这是“monkey异常停止”的日志,所以可能是在monkey测试过程中发生了异常。我们需要关注monkey进程(pid=6355)在最后一个日志文件(__14)中的最后状态,以及下一个日志文件(__15)开始时是否有异常重启的迹象。 在__14的最后,我们看到: ``` 08-07 15:12:58.271280 6355 6355 I Monkey : :Sending Touch (ACTION_DOWN): 0:(638.0,2182.0) ``` 这是monkey测试在发送触摸事件,看起来正常。然后在__15的开始,我们并没有看到monkey进程的日志,而是VolumeDialogImpl的日志。这说明在间隔期间,monkey测试可能已经停止(异常退出?),而系统恢复了用户操作(比如用户按了音量键?)。 因此,我们怀疑monkey测试在15:12:58之后可能遇到了异常退出,而系统在25分钟后(15:37:42)由于用户操作(按音量键)而产生了新的日志。 为了验证,我们需要检查: - monkey进程是否在15:12:58之后退出?可以在日志中搜索monkey进程的死亡信号(如`Signal Catcher`)或者进程结束的日志(如`ActivityManager: Process com.android.commands.monkey (pid 6355) has died`)。 - 系统在间隔期间是否有其他异常? 由于用户没有提供间隔期间的日志,我们只能建议用户检查是否有其他日志文件(如kernel log)覆盖了这段时间,或者检查系统是否进入了休眠。 综上所述,我们给出以下排查步骤: 1. 检查日志间隔期间系统是否进入休眠:查看日志中屏幕状态的变化。 2. 检查monkey测试是否异常退出:在日志中搜索monkey进程结束的信息。 3. 检查ANR日志和tombstone日志。 4. 检查kernel log是否有异常(如死锁、硬件错误等)。 如果以上都没有发现异常,那么日志间隔可能是由于系统休眠导致的正常现象。 相关问题: 1. 如何通过APLog分析系统休眠期间的唤醒源? 2. Monkey测试异常退出的常见原因有哪些? 3. 如何获取和分析ANR日志? 4. 系统日志时间间隔与功耗异常的关系是什么?</think>### Android系统日志APLog时间间隔异常排查指南 日志文件时间戳出现间隔(如从`0807_042752`跳到`0807_065857`)可能是正常现象,但也可能指示系统异常。以下是系统化排查流程: --- #### 一、区分正常休眠与异常中断 1. **检查休眠状态** - 在日志中搜索`PowerManagerService`相关记录: ```bash grep -r "PowerManagerService" APLog_2025_0807_042752__4 ``` - **正常休眠特征**: - `Going to sleep...`后无重要日志 - `Waking up from sleep...`后日志恢复连续 - 符合引用[1]描述的待机状态特征[^1] 2. **检测服务崩溃** - 检查日志服务进程状态: ```bash grep -E "mobilelog_d|logd" APLog_2025_0807_* | grep "died" ``` - **异常特征**: - 出现`FATAL EXCEPTION`或`Process died` - 连续多次`WatchdogThread`报错(引用[1])[^1] - 日志恢复后出现`Reinitializing logger` --- #### 二、排查系统阻塞问题 1. **ANR分析**(引用[2])[^2] - 检查主线程阻塞: ```bash grep "ANR in" *.txt ``` - 关键排查点: ```mermaid graph TD A[ANR发生] --> B{InputDispatch类型} B -->|No Focus Window| C[检查onResume完成时间] B -->|Waiting Event| D[检查APP idle状态] C --> E{onResume未完成?} E -->|是| F[APP Related Issue] E -->|否| G[WMS Issue] ``` 2. **死锁检测** - 搜索`deadlock`或`monitor contention`: ```bash grep -r "monitor contention" APLog_2025_0807_065857__5 ``` - 重点关注`Binder`线程阻塞(引用[2])[^2] --- #### 三、存储与I/O异常排查 1. **存储空间检查** - 在日志中搜索空间警告: ```bash grep -i "storage" *.txt | grep -E "full|low" ``` - MTKLog默认策略: - 剩余空间<10%:停止新日志记录 - 剩余空间<5%:删除最旧日志 2. **I/O性能分析** - 检查文件系统延迟: ```bash grep "E/WVMExtractor" APLog_2025_0807_*.txt ``` - 异常指标: - `I/O timeout > 2000ms` - `mmap failed`错误 --- #### 四、硬件与驱动层排查 1. **唤醒源分析**(引用[1])[^1] - 提取唤醒源统计: ```bash grep "wakeup_reason" */kernel_* ``` - 异常模式: $$ \text{唤醒次数} > \frac{\text{休眠时间(min)}}{5} $$ 2. **传感器异常** - 检查传感器服务: ```bash grep "SensorService" */main_log_* ``` - 关键错误: - `binder thread pool overflow` - `delayed event > 500ms` --- #### 五、日志服务自检 1. **配置参数验证** - 关键配置项: | 参数 | 默认值 | 说明 | |---|---|---| | persist.logd.size | 10MB | 单个日志文件上限 | | persist.logd.period | 1hr | 强制滚动周期 | | persist.logd.lowstorage | 10% | 停止记录阈值 | 2. **调试日志启用** ```bash adb shell setprop persist.logd.dbg 1 adb shell killall mobilelog_d ``` --- #### 结论与建议 1. **正常场景**(无需处理): - 休眠期间无事件发生 - 日志文件大小未达滚动阈值 - 符合引用[1]的待机功耗模型[^1] 2. **异常场景**(需修复): - 连续出现`ANR`或`deadlock`(引用[2]流程)[^2] - 日志服务频繁重启 - 存储I/O延迟>2秒 > **优先排查**:结合引用[2]的ANR分析流程,检查`InputDispatch`类型和主线程状态[^2],这是最常见的日志中断原因。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值