如何在 Android 源碼環境下增大 Linux 內核的 kernel log 的緩存空間?

我希望對Android源碼system/core/init/init.c中main函數及其調用函數的執行狀況有比較直觀的了解,因此使用了system/core/init/log.h中定義的宏INFO(x...)做了一些log輸出,這個宏最終會調用system/core/libcutils/klog.c中的klog_write方法,因此最終輸出的log屬於kernel log,命令行下執行adb shell dmesg &> log.txt可以導出kernel log進行查看,但是隨著需要輸出的log變多,我發現緩存kernel log的空間似乎是有限的,後面的log會覆蓋前面的log,我嘗試修改system/core/toolbox/dmesg.c中的宏FALLBACK_KLOG_BUF_SHIFT和system/core/libcutils/klog.c中的宏LOG_BUF_MAX以求增大緩存空間,但是都沒有效果,我對Linux內核和kernel log相應的機制沒有了解,希望了解這方面知識的人能夠給我解釋和可行的方案,謝謝~


需要修改 Linux 內核源碼中的一個控制 log buffer size 的宏:CONFIG_LOG_BUF_SHIFT,buffer size 是 2 ^ shift,加大這個就可以。

一、配置

$ make menuconfig

General setup

(18)Kernel log buffer size (16 =&> 64KB,17 =&> 128KB)

二、源碼

kernel/printk.c

#define __LOG_BUF_LEN (1 &<&< CONFIG_LOG_BUF_SHIFT)

static char __log_buf[__LOG_BUF_LEN];

可以看到,是已經在編譯時定死的一塊靜態空間,不能動態調整了。對於內核日誌,唯一可以調整的在:/proc/sys/kernel/printk*

三、限制

init/Kconfig

config LOG_BUF_SHIFT

int "Kernel log buffer size (16 =&> 64KB, 17 =&> 128KB)"

range 12 21

default 17

help

Select kernel log buffer size as a power of 2.

Examples:

17 =&> 128 KB

16 =&> 64 KB

15 =&> 32 KB

14 =&> 16 KB

13 =&> 8 KB

12 =&> 4 KB

可以看到 shift 最大值限制到了 21,也就是:2 M

$ echo "(2^21)/1024/1024" | bc

2

如果再要加大,只能改源碼了。


系統默認的kernel log開的都比較小。你需要修改兩個地方:

1. 改kernel的defconfig,把CONFIG_LOG_BUF_SHIFT改大

2. 如果你用dmesg導出log,需要修改dmesg的源碼,這裡面也用到了這個宏,把這個也改大,和kernel的配置保持一致


We can modify the code to increase the buffer size to catch those early log:

alps/kernel/kernel/printk.c

#define __LOG_BUF_LEN (1 &<&< CONFIG_LOG_BUF_SHIFT)

====&> Let buffer size x 32

#define __LOG_BUF_LEN (1 &<&< CONFIG_LOG_BUF_SHIFT &<&< 5)


推薦閱讀:

勒索軟體新年第一槍 從感染LG智能電視開始
如何評價「愛今天」這款應用?
Android 開發助手 1.2.0 版
Android SpringAnimation 安卓模擬彈簧動畫
移動端項目踩到的坑及解決方案

TAG:Linux | Android開發 | Android | Linux開發 | Linux內核 |