轉載:http://blog.chinaunix.net/u1/38038/showart_1359825.html
linux裝置驅動調試,我們在核心中看到核心使用dev_dbg來控制輸出資訊,這個函數的實質是調用printk(KERN_DEBUG
)來輸出列印資訊。要開啟這個開關需要下面兩步。
1、開啟調試開關:你調試的檔案中必然包含了<linux/device.h>,或者<linux /paltforam_device.h>,後者包含了前者,在包含此標頭檔之前,使用#define
DEBUG 1 來開啟調試開關:例如
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/clk.h>
#include <linux/module.h>
#define DEBUG 1
#include <linux/platform_device.h>
在linux/device.h檔案中:
#define dev_printk(level, dev, format, arg...) \
printk(level "%s %s: " format , dev_driver_string(dev) , (dev)->bus_id , ## arg)
#ifdef DEBUG
#define dev_dbg(dev, format, arg...) \
dev_printk(KERN_DEBUG , dev , format , ## arg)
#else
static inline int __attribute__ ((format (printf, 2, 3)))
dev_dbg(struct device * dev, const char * fmt, ...)
{
return 0;
}
#endif
但是這個開啟了之後,也不能順利的輸出資訊,原因是printk有預設的資訊層級。
linux/kernel檔案中
#define KERN_EMERG "<0>"
#define KERN_ALERT "<1>"
#define KERN_CRIT "<2>"
#define KERN_ERR "<3>"
#define KERN_WARNING "<4>"
#define KERN_NOTICE "<5>"
#define KERN_INFO "<6>"
#define KERN_DEBUG "<7>"
可以看到KERN_DEBUG是層級最低的。
2、修改檔案kernel/printk檔案
#define DEFAULT_MESSAGE_LOGLEVEL 4
#define MINIMUM_CONSOLE_LOGLEVEL 1
#define DEFAULT_CONSOLE_LOGLEVEL 8
其中DEFAULT_CONSOLE_LOGLEVEL 為終端console輸出的最低層級,比這嚴重的都將輸出。原來該值為7,則調試資訊無法輸出,修改為8則全部有輸出。