2016年1月25日 星期一

核心偵錯技巧....printk


技巧 1:

改一個會變身的的printk()...

#undef PDEBUG
#ifdef SCULL_DEBUG
      #ifdef __KERNEL__
             /*  用於kernel space 的debug
             #define PDEBUG(fmt, args...)  printk(KERN_DEBUG "scull:" fmt, ##args)
      #else
             /*   用於user space 的 debug
            #define PDEBUG(fmt,args...)    fprintf(stderr, fmt, ## args)
      #endif
#else
      #define PDEBUG(fmt, args...)   /*不偵錯*/
#endif

然後修改  Makefile

DEBUG = y

ifeq($(DEBUG),y)
   DEBFLAGS = -O -g -DSCULL_DEBUG
else
  DEBFLAGS = -O2
endif

CFLAGS +=$(DEBFLAGS)

以後只要需要開始kernel space 的 debug...

只要在Makefile 裡面加上 DEBUG =y

就可以讓  PDEBUF -> printk...

如果已經debug完....不需要再printk....就可以把  變數DEBUG 設成 n 就可以了


技巧 2:  節制訊息產生的速率

    if(printk_ratelimit())
       printk();

printk_ratelimit() 的原理是追蹤已有多少的訊息被送到操控台...若訊息超過臨界點,
printk_ratelimit() 就傳回 0....並丟棄訊息...

技巧3 : /proc 是核心模擬出來的軟體檔案系統..他是核心對於外界的資訊窗口....

       以   /proc/modules   ..他會告訴你核心當時已經載入了那些模組...



Reference :  linux 驅動程式

沒有留言:

張貼留言