如何開啟 pr_debug() 的輸出
最近論文在寫 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