如果机器如果把当前系统时间往前调整(比如当前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;
}