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看看效果吧(是不是很爽?)
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看看效果吧(是不是很爽?)
相关文章推荐
- Linux kernel debug技巧----开启DEBUG选项
- Debug Linux Kernel with Qemu
- linux_kernel_debug_tips_根据函数地址定位函数名称
- Linux Systemcall By INT 0x80、Llinux Kernel Debug Based On Sourcecode
- Linux kernel oops panic 调试技巧
- Linux 程序开发打印 Debug 信息的使用技巧
- Debug a NIC driver in linux(kernel version 2.4.20-8) which running on VMware workstation version 4.5.2
- make -C $(LINUX_KERNEL_PATH) M=$(PWD) modules中的M选项
- Linux kernel oops panic 调试技巧
- 在linux下面tomcat开启远程debug
- Linux 程序开发打印 Debug 信息的使用技巧
- Linux kernel Low Level debug
- Linux ( kernel<<2.6.18-164 )开启…
- Kprobe在Linux kernel debug中的应用
- Kprobe在Linux kernel debug中的应用
- Using KGDB debug linux kernel and kernel module
- 使用qemu进行linux kernel debug
- Linux Kernel Debug | 这个人的博客真心不错,包括其他类别
- Linux Kernel Crash Debug
- HOWTO: install kernel debuginfo packages on SUSE Linux Enterprise Server 11