1.init进程 日志调试相关
Android 调试 Init进程时,会出现日志打印不全的情况,添加日志后达不到预期的效果。
所以解决 init 进程相关问题,首先要解决 日志问题。
下面是用到的几种方法。
方法一:
内核代码中找到这个文件 kernel/printk/printk.c
在下面这个函数中
static ssize_t devkmsg_write(struct kiocb *iocb, struct iov_iter *from)
注释掉下面这两句话:
/* Ratelimit when not explicitly enabled. */
if (!(devkmsg_log & DEVKMSG_LOG_MASK_ON)) {
- if (!___ratelimit(&user->rs, current->comm))
- return ret;
+ //if (!___ratelimit(&user->rs, current->comm))
+ //return ret;
}
buf = kmalloc(len+1, GFP_KERNEL);
方法二:
diff --git a/kernel/include/linux/ratelimit.h b/kernel/linux-4.9.y/include/linux/ratelimit.h
index 57c9e0622..d8cc7dba9 100644
--- a/kernel/include/linux/ratelimit.h
+++ b/kernel/include/linux/ratelimit.h
@@ -6,7 +6,7 @@
#include <linux/spinlock.h>
#define DEFAULT_RATELIMIT_INTERVAL (5 * HZ)
-#define DEFAULT_RATELIMIT_BURST 10
+#define DEFAULT_RATELIMIT_BURST 100000
/* issue num suppressed message on exit */
#define RATELIMIT_MSG_ON_RELEASE BIT(0)
diff --git a/kernel/kernel/printk/printk.c b/kernel/kernel/printk/printk.c
index 20fc294fb..9701e0f5a 100644
--- a/kernel/kernel/printk/printk.c
+++ b/kernel/kernel/printk/printk.c
@@ -388,7 +388,7 @@ static u32 clear_idx;
/* record buffer */
#define LOG_ALIGN __alignof__(struct printk_log)
-#define __LOG_BUF_LEN (1 << CONFIG_LOG_BUF_SHIFT)
+#define __LOG_BUF_LEN ( 4*1024 *1024 )
+#define LOG_BUF_LEN_MAX (4*1024 *1024)
static char __log_buf[__LOG_BUF_LEN] __aligned(LOG_ALIGN);
static char *log_buf = __log_buf;
static u32 log_buf_len = __LOG_BUF_LEN;
注:这条作为参考
--- a/base/logging.cpp
+++ b/base/logging.cpp
@@ -163,7 +163,7 @@ void SetDefaultTag(const std::string& tag) {
}
static bool gInitialized = false;
-static LogSeverity gMinimumLogSeverity = INFO;
+static LogSeverity gMinimumLogSeverity = VERBOSE;
2.参考博文
Android 9 (P)之init进程启动源码分析指南之三
Android 9 (P)之init进程启动源码分析指南之三_bootstat.rc-CSDN博客
这三篇可以都看看。
Android 系统的启动流程