[轉自:http://hi.baidu.com/dreammerge/item/1fe7e04db5cd8fea1e19bca0]
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)#elsestatic inline int __attribute__ ((format (printf, 2, 3)))dev_dbg(struct device * dev, const char * fmt, ...){ return 0;}#endif
但是這個開啟了之後,也不能順利的輸出資訊,原因是printk有預設的資訊層級。
linux/kernel.h檔案中
#define KERN_EMERG "<0>" /* system is unusable */#define KERN_ALERT "<1>" /* action must be taken immediately */#define KERN_CRIT "<2>" /* critical conditions */#define KERN_ERR "<3>" /* error conditions */#define KERN_WARNING "<4>" /* warning conditions */#define KERN_NOTICE "<5>" /* normal but significant condition */#define KERN_INFO "<6>" /* informational */#define KERN_DEBUG "<7>" /* debug-level messages */
可以看到KERN_DEBUG是層級最低的。
2、修改檔案kernel/printk.h檔案
/* printk's without a loglevel use this.. */#define DEFAULT_MESSAGE_LOGLEVEL 4 /* KERN_WARNING *//* We show everything that is MORE important than this.. */#define MINIMUM_CONSOLE_LOGLEVEL 1 /* Minimum loglevel we let people use */#define DEFAULT_CONSOLE_LOGLEVEL 8 /* anything MORE serious than KERN_DEBUG */
其中DEFAULT_CONSOLE_LOGLEVEL 為終端console輸出的最低層級,比這嚴重的都將輸出。原來該值為7,則調試資訊無法輸出,修改為8則全部有輸出。
可能比較關鍵的是DEBUG需要在標頭檔之前定義!!!