如何增加logcat缓冲区的大小

155次阅读
没有评论

问题描述

想要了解如何将 /dev/log/main 的大小增加十倍。他的理解是日志具有固定大小(16K?),并且在达到限制时会翻转。用户想要找出当前日志大小设置,并将其大幅增加。

用户正在调试一个问题,该问题在设备长时间未使用(大约一个小时?)后偶尔出现。他已经在代码中加入了日志消息,以便在出现错误时了解发生了什么。

用户遇到的问题是,他的日志记录导致日志在约2分钟内翻转。他希望能够将 /dev/log/main 的大小增加十倍,如果可能的话。

解决方案

请注意以下操作可能涉及版本差异,以及修改前请做好备份。

方案1

从 Android 5 开始,内核中的 logger 驱动已被弃用,通过 /dev/log/* 字符设备公开了环形缓冲区。取而代之的是一个名为 logd 的用户空间日志守护程序管理着缓冲区 “main”、”system”、”radio”、”events” 和 “crash”。稍后还添加了可选缓冲区 “security”(例如用于 adb shell/push/pull 日志记录)以及在 userdebug 构建中的 “kernel”(用于 klogd)和 “stats”(用于日志统计)。logd 主要涵盖了其桌面端的同名程序 syslogd 的功能,但也包括了 klogd 和部分 auditd,以从内核的 SELinux 子系统获取日志。通过不同的 属性 来控制日志守护程序的行为。

应用程序和本地进程通过套接字 /dev/socket/logdw(利用 liblog 函数)将它们的日志写入相关缓冲区。logcat 命令通过套接字 /dev/socket/logdr 从缓冲区读取日志,同时通过套接字 /dev/socket/logd 控制守护程序和缓冲区。使用 -g/-G 选项来获取和设置单个缓冲区的大小:

  -g, --buffer-size                  获取环形缓冲区的大小。
  -G <size>, --buffer-size=<size>    设置日志环形缓冲区的大小,可以加上 K 或 M 后缀。

在开发者选项中还有一个选项:Logger buffer sizes(也设置属性 persist.logd.size)用于为所有缓冲区设置相同的大小。

persist.logd.size/data/property/ 中读取,除非挂载和解密了 /data(在 FDE 的情况下)。但有时在那之前缓冲区可能会溢出,所以解决方案是在 logd 服务启动之前设置 ro.logd.size(通过 default.prop/build.prop 或直接在一些 *.rc 文件中)。

方案2

要找出环形缓冲区的实际大小,可以使用以下命令:

$ adb logcat -g

要调整环形缓冲区的大小,可以尝试以下命令:

$ adb logcat -G <kbytes>

至少某些教程是这样说的。欲了解更多细节,可以阅读 “adb logcat” Command Options and Log Buffers

P.S.: 我猜那些设置(手动调整的环形缓冲区大小)不会在重启后生效,需要考虑这一点。

方案3

如果您想要在重启后持久地更改日志缓冲区的默认大小,可以重新编译内核以更新缓冲区大小。

包含日志缓冲区定义的文件是:

<kernel>/drivers/staging/android/logger.c

我看到的版本使用一个宏在该文件中定义日志缓冲区:

DEFINE_LOGGER_DEVICE(variable, name, size)

可能会有多个日志记录器;”main” 通常是您要查找的。

正文完