1. 程式人生 > >Android系統底層驅動除錯之資訊列印級別

Android系統底層驅動除錯之資訊列印級別

(本文說明的平臺:msm8953,系統:Android N,其他平臺和系統可作為參考使用) 

   在Linux中除錯核心模組時使用printk函式來列印除錯資訊時,可以設定列印資訊的級別。那麼就肯定會有這樣一個設定,用於控制終端顯示的資訊級別的。這個是通過/proc/sys/kernel/printk檔案內容來控制。

    在Android N版本中的預設設定是7    0    1    7

    可以使用命令:# cat /proc/sys/kernel/printk來檢視

    該檔案中四個值,他們根據日誌記錄訊息的重要程度,用於確定訊息是否顯示或者訊息傳送到何處。檔案中的數值越小,表示該優先順序越高。他們的具體是定義是在android/kernel/msm-3.18/kernel/printk/printk.c 中,如下所示:

int console_printk[4] = {
	CONSOLE_LOGLEVEL_DEFAULT,	/* console_loglevel */
	MESSAGE_LOGLEVEL_DEFAULT,	/* default_message_loglevel */
	CONSOLE_LOGLEVEL_MIN,		/* minimum_console_loglevel */
	CONSOLE_LOGLEVEL_DEFAULT,	/* default_console_loglevel */
};

上述定義的陣列中的四個元素對應著 /proc/sys/kernel/printk檔案中的四個值,他們表示的含義分別為:

控制檯日誌級別:優先順序高於該值的訊息將被列印至控制檯
預設的訊息日誌級別:將用該優先順序來列印沒有優先順序的訊息
最低的控制檯日誌級別:控制檯日誌級別可被設定的最小值(最高優先順序)

預設的控制檯日誌級別:控制檯日誌級別的預設值

系統kernel層中列印訊息使用printk()函式時的訊息級別說明:

        級別值說明
        KERN_EMERG0致命錯誤
KERN_ALERT1報告訊息
KERN_CRIT2嚴重異常
KERN_ERR3出錯
KERN_WARNING4警告
KERN_NOTICE5通知
KERN_INFO6常規
KERN_DEBUG7除錯

Log可以使用下列相關命令來檢視:

dmesg 或 cat /proc/kmsg
logcat -L 或 cat /proc/last_kmsg

logcat -b events -b system

    在Android N系統中,系統執行起來之後,使用cat /proc/sys/kernel/printk命令檢視之後發現其值不是核心中設定的預設值。而是    0    6    1    7 。在實際除錯的過程中也可以手動的方式來調整該檔案的值。具體如下:

    1、 使用   echo 7 > /proc/sys/kernel/printk命令。用於改變四個引數中的第一個引數值。

修改之後該檔案的值會變成:7    6    1    7

    2、 使用echo 7    4    1    7 > /proc/sys/kernel/printk命令。用於改寫檔案中的全部四個引數。

修改之後該檔案的值當然就是:7    4    1    7

    若需要經常除錯Android系統的Framework層時,每次重新編譯了system.img,重新燒入到裝置中後都需要再次手動修改,也是比較麻煩,那在什麼地方可以設定這個檔案的預設值呢。

經在原始碼中查詢發現在如下兩個檔案中可以設定初始值和系統系統之後的預設值

    ./android/device/qcom/common/rootdir/etc/init.qcom.rc:184:    write /proc/sys/kernel/printk "6 6 1 7"

    ./android/device/qcom/common/rootdir/etc/init.qcom.post_boot.sh:2375:        echo 0 > /proc/sys/kernel/printk

    上述的第一個檔案中表示向/proc/sys/kernel/printk檔案寫入的初始值,在系統啟動過程中負責向終端列印顯示資訊。

    上述的第二個檔案是在Android系統啟動完成之後,可以通過這個檔案重新設定資訊的列印級別,寫入0則表示任何訊息都不列印了。

所以將上述的兩個檔案按實際需求進行改寫,例如下:

./android/device/qcom/common/rootdir/etc/init.qcom.rc:184:    write /proc/sys/kernel/printk "7 6 1 7"

./android/device/qcom/common/rootdir/etc/init.qcom.post_boot.sh:2375:        echo 7 > /proc/sys/kernel/printk

就可以在每次重新編譯系統之後也會一直列印輸出除錯資訊到終端了。

前人種樹,後人乘涼。感謝前人的貢獻能幫助到我們,也希望我能繼續幫助到後續來者。