分享

Linux kernel debug技巧

 WUCANADA 2017-09-15

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

作者:wowo 发布于:2016-11-1 19:39 分类:Linux应用技巧

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

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多