Android 设备的日志缓冲区被写满,logcat: Unexpected EOF!

  • 在 Android Studio 中,使用 Logcat 时,出现如下信息

    WARNING: Logcat was not cleared on the device itself because 'logcat -c' timed out.
    logcat: Unexpected EOF!

    This means that either the device shut down, logd crashed, or this instance of logcat was unable to read log
    messages as quickly as they were being produced.

    If you have enabled significant logging, look into using the -G option to increase log buffer sizes.

问题原因
  1. Android 设备的日志缓冲区被写满了,而且新日志生成的速度太快,导致 Logcat 读取跟不上,从而连接中断

  2. 报错的是 Android Studio,也就是 ADB 客户端,而不是设备本身

    1. 写入速度大于读取速度,生产者(设备)和消费者(Android Studio)之间出现了速度差

    2. 如果生产者写入新数据的速度极快,以至于在新数据覆盖旧数据的过程中,把 Android Studio 还没来得及读取的那段旧数据也给覆盖掉了,于是报错

处理策略
  • 使用 ADB 清空现有日志,立即恢复
shell 复制代码
adb logcat -c
补充学习
  1. 查看缓冲区大小
shell 复制代码
adb logcat -g
复制代码
# 输出结果

main: ring buffer is 16 MiB (597 KiB consumed), max entry is 5120 B, max payload is 4068 B
system: ring buffer is 16 MiB (256 KiB consumed), max entry is 5120 B, max payload is 4068 B
crash: ring buffer is 16 MiB (0 B consumed), max entry is 5120 B, max payload is 4068 B
kernel: ring buffer is 16 MiB (12 KiB consumed), max entry is 5120 B, max payload is 4068 B
  1. 修改缓冲区大小,例如,将缓冲区大小设为 4MB
shell 复制代码
adb logcat -G 4m
  1. 缓冲区的"自清"

    1. Android 的 logcat 缓冲区在底层是一个环形缓冲区

    2. 当新日志写入时,如果缓冲区还有剩余空间,就直接追加

    3. 当缓冲区完全写满时,新日志会从缓冲区的头部开始覆盖最旧的日志

相关推荐
SimonKing4 小时前
SpringBoot 集成 SSE 实现服务端推送或可代替Websocket
java·后端·程序员
不正经的码狗4 小时前
JAVA 、Eclipse 安装及配置 JAVA 项目(无需配置环境)
java·eclipse
xiaoqiMikko4 小时前
你升的是 jackson-databind,中招的是 jackson-core:一个超长 JSON key 就能吃掉 200MB 堆
java·安全
2501_916008894 小时前
如何实现iOS App代码混淆:SwiftShield使用指南
android·ios·小程序·https·uni-app·iphone·webview
不正经的码狗4 小时前
Eclipse汉化(快速,推荐)
java·eclipse
极客互动API4 小时前
极客互动-企业微信基于外部API接口实现AI客服自动接管外部联系人消息收发
java·微信·企业微信·ai编程·rpa
Sam_Deep_Thinking4 小时前
关于java final关键字的可见性
java·后端·面试·程序员
tryxr4 小时前
矩阵的几种基础变换
java·数据结构·算法·矩阵
写后端的胖头鱼4 小时前
如何区分IO/CPU 密集型,线程池核心参数怎么设置
java·线程池·多线程·io密集·cpu密集
JAVA面经实录9174 小时前
IDEA 开发知识
java·intellij-idea·idea