Linux kernel debug技巧----開啟DEBUG選項(xiàng)作者:wowo 發(fā)布于:2016-11-1 19:39 分類:Linux應(yīng)用技巧 kernel的source code中有很多使用pr_debug/dev_dbg輸出的日志信息(例如device tree解析的代碼,drivers/of/fdt.c)。默認(rèn)情況下,kernel不會(huì)將這些日志輸出到控制臺上,除非: 1)開啟了DEBUG宏,并且 2)kernel printk的默認(rèn)日志級別大于7
看似簡單,不過我相信每個(gè)人都問過這樣的問題(不管是問自己還是問別人,特別是在調(diào)試kernel啟動(dòng)過程的時(shí)候,例如device tree的匹配、device probe等):怎么開啟DEBUG選項(xiàng)? 之所以有這篇短文,是因?yàn)槲乙矄栠^(不止一次),于是就記錄如下: 1)開啟了DEBUG宏 其實(shí)開啟DEBUG宏的方法很簡單,在需要pr_debug/dev_dbg輸出的模塊開頭,直接#define DEBUG即可,kernel中有一個(gè)例子: /* init/main.c */ #define DEBUG /* Enable initcall_debug */
不過這種方法有個(gè)缺點(diǎn):我們必須準(zhǔn)確的知道需要debug那個(gè)C文件,如果想大網(wǎng)撒魚(例如,想debug為什么新修改的DTS文件沒有起作用,而又對kernel fdt的代碼不是很熟悉),就麻煩了。這里我給一個(gè)大殺器:在編譯kernel的時(shí)候,通過KCFLAGS直接傳遞,這樣可以全局生效,如下(以本站的“X Project”為例): diff --git a/Makefile b/Makefile index 0835b1c..59625f4 100644 --- a/Makefile +++ b/Makefile @@ -83,7 +83,7 @@ kernel-config: kernel: mkdir -p $(KERNEL_OUT_DIR) make -C $(KERNEL_DIR) CROSS_COMPILE=$(CROSS_COMPILE) KBUILD_OUTPUT=$(KERNEL_OUT_DIR) ARCH=$(BOARD_ARCH) $(KERNEL_D - make -C $(KERNEL_DIR) CROSS_COMPILE=$(CROSS_COMPILE) KBUILD_OUTPUT=$(KERNEL_OUT_DIR) ARCH=$(BOARD_ARCH) $(KERNEL_T + make -C $(KERNEL_DIR) CROSS_COMPILE=$(CROSS_COMPILE) KBUILD_OUTPUT=$(KERNEL_OUT_DIR) KCFLAGS=-DDEBUG ARCH=$(BOARD_
2)設(shè)置kernel printk的默認(rèn)日志級別為8 修改printk的默認(rèn)日志級別的方法有多種,例如直接修改printk.c(新kernel為printk.h)中的CONSOLE_LOGLEVEL_DEFAULT宏定義。不過修改kernel原生代碼的方式稍顯粗暴,我們還有優(yōu)雅一些的手段,例如通過命令行參數(shù)的loglevel變量傳遞,如下: diff --git a/arch/arm64/configs/xprj_defconfig b/arch/arm64/configs/xprj_defconfig index 5d0d591..9335d3f 100644 --- a/arch/arm64/configs/xprj_defconfig +++ b/arch/arm64/configs/xprj_defconfig @@ -320,7 +320,7 @@ CONFIG_FORCE_MAX_ZONEORDER=11 # # Boot options # -CONFIG_CMDLINE="earlycon=owl_serial" +CONFIG_CMDLINE="earlycon=owl_serial loglevel=8" CONFIG_CMDLINE_FORCE=y # CONFIG_EFI is not set
|