您的位置:首页 > 运维架构 > Linux

Linux kernel debug技巧----开启DEBUG选项

2016-11-07 11:12 661 查看
原文地址:http://www.wowotech.net/linux_application/kernel_debug_enable.html

kernel的source code中有很多使用pr_debug/dev_dbg输出的日志信息(例如device tree解析的代码,drivers/of/fdt.c)。默认情况下,kernel不会将这些日志输出到控制台上,除非:

1)开启了DEBUG宏,并且

2)kernel printk的默认日志级别大于7

看似简单,不过我相信每个人都问过这样的问题(不管是问自己还是问别人,特别是在调试kernel启动过程的时候,例如device tree的匹配、device probe等):怎么开启DEBUG选项?

之所以有这篇短文,是因为我也问过(不止一次),于是就记录如下:

1)开启了DEBUG宏

其实开启DEBUG宏的方法很简单,在需要pr_debug/dev_dbg输出的模块开头,直接#define DEBUG即可,kernel中有一个例子:

/* init/main.c */

#define DEBUG           /* Enable initcall_debug */

不过这种方法有个缺点:我们必须准确的知道需要debug那个C文件,如果想大网撒鱼(例如,想debug为什么新修改的DTS文件没有起作用,而又对kernel fdt的代码不是很熟悉),就麻烦了。这里我给一个大杀器:在编译kernel的时候,通过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)设置kernel printk的默认日志级别为8

修改printk的默认日志级别的方法有多种,例如直接修改printk.c(新kernel为printk.h)中的CONSOLE_LOGLEVEL_DEFAULT宏定义。不过修改kernel原生代码的方式稍显粗暴,我们还有优雅一些的手段,例如通过命令行参数的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

3)修改完之后,编译并启动kernel看看效果吧(是不是很爽?)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: