android kernel debug

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


#if defined(CONFIG_DYNAMIC_DEBUG)

#define dev_dbg(dev, format, ...) \

do { \

dynamic_dev_dbg(dev, format, ##__VA_ARGS__); \

} while (0)

#elif defined(DEBUG)

#define dev_dbg(dev, format, arg...) \

dev_printk(KERN_DEBUG, dev, format, ##arg)

#else

#define dev_dbg(dev, format, arg...) \

({ \

if (0) \

dev_printk(KERN_DEBUG, dev, format, ##arg); \

})

#endif

第一种用法,如果定义了CONFIG_DYNAMIC_DEBUG,就使用动态debug机制dynamic_pr_debug();
第二种用法,如果定义了DEBUG,就使用printk(KERN_DEBUG...)
第三种用法,默认情况下,不打印(所以默认的时候在dmesg中看不到该打印)。

第三种用法肯定不是我们想要,第一种有点复杂,今天我们就来介绍第二种用法

1)开启了DEBUG宏

方法一:最简单的打开DEBUG宏的方法是修改Makefile文件,比如我们要打开kernel/drivers/mmc/下面所有文件以及子目录下所有文件的DEBUG宏,可以在kernel/drivers/mmc/Makefile中添加如下代码,其中,如果是ccflags-y := -DDEBUG表示只打开kernel/drivers/mmc/下面的文件的DEBUG宏,但不包括子目录下的文件的DEBUG宏,而subdir-ccflags-y := -DDEBUG表示全都打开。

方法二:其实开启DEBUG宏的方法很简单,在需要pr_debug/dev_dbg输出的模块开头,直接#define DEBUG即可,切记一定要在开头,如下图所示,如果你放在某个include 头文件之后,有可能这个头文件包含是pr_debug定义的头文件printk.h,导致打印没打开。开启之后,在dmesg中就可以看到pr_debug/dev_dbg的打印了。

在串口或者adb中设置打印级别

echo 7 7 7 7 >/proc/sys/kernel/printk

在添加打印时,确定级别,一定打印出来

printk(KERN_EMERG " rn6864 carl.xu ....  1111  KERN_EMERG\n");

猜你喜欢

转载自blog.csdn.net/u010689853/article/details/112486005