修改系统时间导致logcat read: unexpected EOF!崩溃

如果机器如果把当前系统时间往前调整(比如当前8月20日11点调整为8月18日9点),机器的logcat的buffer就会出现一直增大,超出系统设定的最大buffer size,
比如当前是设置是4M ,但是通过logcat -g 可以达到7M,明显超出系统设置最大buffer。
直到logcat输出出现read: unexpected EOF!,logcat崩溃退出。如下图所示:

在这里插入图片描述
这几天我正在尝试解决这个问题,目前遇到调试系统无法输出的困难。我们知道Android的log日志系统原理大致如下所示:在这里插入图片描述
1、Logd服务是接收app或者service通过log.d、log.e、和log.i发送调试信息保存到main buffer 和system buffer中。
2、logcat 通过socket 方式读取 logd服务中main buffer 和system buffer的调试信息。

经过我初步分析logcat崩溃退出原因在于logd服务出错,
我在logd服务相关代码中添加调试信息printf 和SLOGE ,然后通过logcat获取这些信息失败。调试工作无法进行
最后咨询高通技术,他们说这个问题是Android 8.1的 原生问题。目前已经提供patch

diff --git a/liblog/pmsg_reader.c b/liblog/pmsg_reader.c
index c3ed8a2..bf0e4fe 100644
--- a/liblog/pmsg_reader.c
+++ b/liblog/pmsg_reader.c
@@ -269,6 +269,14 @@
   }
 }
 

 LIBLOG_ABI_PRIVATE ssize_t
 __android_log_pmsg_file_read(log_id_t logId, char prio, const char* prefix,
                              __android_log_pmsg_file_read_fn fn, void* arg) {
@@ -541,7 +549,7 @@
       /* Missing sequence numbers */
       while (sequence < content->entry.nsec) {
         /* plus space for enforced nul */
-        buf = realloc(buf, len + sizeof(char) + sizeof(char));
+        buf = realloc_or_free(buf, len + sizeof(char) + sizeof(char));
         if (!buf) {
           break;
         }
@@ -556,7 +564,7 @@
         continue;
       }
       /* plus space for enforced nul */
-      buf = realloc(buf, len + add_len + sizeof(char));
+      buf = realloc_or_free(buf, len + add_len + sizeof(char));
       if (!buf) {
         ret = -ENOMEM;
         list_remove(content_node);

static void* realloc(void* ptr, size_t new_size) {
  void* result = realloc(ptr, new_size);
  if (!result) {
    free(ptr);
  }
  return result;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

九霄的爸爸

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值