最近論文在寫 Kernel module,需要看 Kernel 裡面的 pr_debug() 的資訊
不過網路上的教學都不太好懂,這邊簡單紀錄一下做法
備註:不一定所有情況都能使用

環境

  • OS: Ubuntu 18.04
  • Kernel: 5.0.0-36-generic

確認 Kernel 編譯參數

首先要確認 Kernel 編譯參數,因為這關係到 pr_debug() 的定義

下面是在 include/linux/printk.h 中的 pr_debug() 定義

/* If you are writing a driver, please use dev_dbg instead */
#if defined(CONFIG_DYNAMIC_DEBUG)
    #include <linux/dynamic_debug.h>

    /* dynamic_pr_debug() uses pr_fmt() internally so we don't need it here */
    #define pr_debug(fmt, ...) \
	    dynamic_pr_debug(fmt, ##__VA_ARGS__)
#elif defined(DEBUG)
    #define pr_debug(fmt, ...) \
        printk(KERN_DEBUG pr_fmt(fmt), ##__VA_ARGS__)
#else
    #define pr_debug(fmt, ...) \
        no_printk(KERN_DEBUG pr_fmt(fmt), ##__VA_ARGS__)
#endif

如果是自己的 Module 要使用,那只要編譯時 define DEBUG 就行

不過這次是 pr_debug() 是在 Kernel 中,並不打算重編 Kernel
所以就要用到 CONFIG_DYNAMIC_DEBUG

首先先檢查 CONFIG_DYNAMIC_DEBUG 有沒有啟用

grep -i CONFIG_DYNAMIC_DEBUG /boot/config-5.0.0-36-generic 
CONFIG_DYNAMIC_DEBUG=y

(如果沒有的話…就只能自己編 Kernel 囉)

接著切換到 root,提高 printk 的輸出等級(level)

echo 8 > /proc/sys/kernel/printk

接著設定想啟用哪一個檔案的 pr_debug()
這次是 lib/asn1_decoder.c

echo 'file lib/asn1_decoder.c +p' > /sys/kernel/debug/dynamic_debug/control

大功告成,pr_debug() 接下來就會輸出了,可以在 dmesg 看到

參考資料

https://www.kernel.org/doc/html/v5.0/admin-guide/dynamic-debug-howto.html