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

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

修改系统时间导致logcat read: unexpected EOF!崩溃_第1张图片
这几天我正在尝试解决这个问题,目前遇到调试系统无法输出的困难。我们知道Android的log日志系统原理大致如下所示:修改系统时间导致logcat read: unexpected EOF!崩溃_第2张图片
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;
}

你可能感兴趣的:(android,log)