如何在 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 17help
Select kernel log buffer size as a power of 2. Examples: 17 =&> 128 KB16 =&> 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 安卓模擬彈簧動畫
※移動端項目踩到的坑及解決方案