1. 程式人生 > >Linux驅動開發除錯 -- 開啟dev_dbg()【轉】

Linux驅動開發除錯 -- 開啟dev_dbg()【轉】

本文轉載自:https://blog.csdn.net/kunkliu/article/details/78048618

轉載地址:http://blog.chinaunix.net/uid-22841689-id-3924244.html

一、列印除錯       
        linux裝置驅動除錯,我們在核心中看到核心使用dev_dbg來控制輸出資訊,這個函式的實質是呼叫
printk(KERN_DEBUG )來輸出列印資訊。要開啟這個開關需要下面兩步。

 

1.1、開啟除錯開關
        你除錯的檔案中必然包含了<linux/device.h>,或者<linux /paltforam_device.h>,後者包含了前者,
在包含此標頭檔案之前,使用#define DEBUG 1 來開啟除錯開關:例如

點選(此處)摺疊或開啟

  1. #include <linux/kernel.h>
  2. #include <linux/init.h>
  3. #include <linux/clk.h>
  4. #include <linux/module.h>
  5. #define DEBUG 1
  6. #include <linux/platform_device.h>
     在linux/device.h檔案中:

點選(此處)摺疊或開啟

  1. #define dev_printk(level, dev, format, arg...)\
  2.     printk(level "%s %s: " format , dev_driver_string(dev), (dev)->bus_id, ## arg)
  3. #ifdef DEBUG
  4. #define dev_dbg(dev, format, arg...)\
  5.     dev_printk(KERN_DEBUG , dev , format , ## arg)
  6. #else
  7. static inline int __attribute__ ((format (printf, 2, 3)))
  8. dev_dbg(struct device * dev, const char* fmt, ...)
  9. {
  10.     return 0;
  11. }
  12. #endif
        但是這個打開了之後,也不能順利的輸出資訊,原因是printk有預設的資訊級別。
        linux/kernel檔案中

點選(此處)摺疊或開啟

  1. #define KERN_EMERG "<0>"
  2. #define KERN_ALERT "<1>" 
  3. #define KERN_CRIT "<2>" 
  4. #define KERN_ERR "<3>" 
  5. #define KERN_WARNING "<4>" 
  6. #define KERN_NOTICE "<5>" 
  7. #define KERN_INFO "<6>" 
  8. #define KERN_DEBUG "<7>"
        可以看到KERN_DEBUG是級別最低的。
1.2、修改檔案kernel/printk檔案

點選(此處)摺疊或開啟

  1. #define DEFAULT_MESSAGE_LOGLEVEL 4
  2. #define MINIMUM_CONSOLE_LOGLEVEL 1
  3. #define DEFAULT_CONSOLE_LOGLEVEL 8
        其中DEFAULT_CONSOLE_LOGLEVEL 為終端console輸出的最低級別,比這嚴重的都將輸出。
原來該值為7,則除錯資訊無法輸出,修改為8則全部有輸出。
1.3、修改Makefile
        通過配置核心選項,修改Makefile實現顯示列印除錯資訊。Kconfig內容如下:

點選(此處)摺疊或開啟

  1. config ADC_DEV_DEBUG
  2.     bool "adc dev debugging messages"
  3.     depends on ADC_INTF_DEV
  4.     help
  5.      Say Y here if you want the adc dev to produce a bunch of debug
  6.      messages to the system log. Select thisif you are having a
  7.      problem with adc core and want to see more of what is going on.
        Makefile內容如下:

點選(此處)摺疊或開啟

  1. #
  2. # Makefile for the i2c bus drivers.
  3. #
  4. obj-$(CONFIG_GSC_SPI0_ADC_CORE)        += adc-core.o
  5. obj-$(CONFIG_ADC_INTF_DEV)            += adc-dev.o
  6. obj-$(CONFIG_ADC_INTF_PROC)            += adc-proc.o
  7. obj-$(CONFIG_ADC_INTF_SYSFS)            += adc-sysfs.o
  8. obj-$(CONFIG_GSC3280_ADC)            += gsc3280_adc.o
  9. ccflags-$(CONFIG_GSC_ADC_DEV_DEBUG)+= -DGSC3280_ADC_DEV_DEBUG
        紅色部分即是。當核心配置選中後,CONFIG_GSC_ADC_DEV_DEBUG即被定義,編譯後,原始碼中使用
GSC3280_ADC_DEV_DEBUG巨集定義的除錯語句將被列印。