1> 所有系統資訊是輸出到ring buffer中去的.dmesg所顯示的內容也是從ring buffer中讀取的.
2> linux系統中/etc/init.d/sysklogd會啟動2個守護程序:klogd&&syslogd
3> klogd是負責讀取核心資訊的,有2種方式:
syslog()系統呼叫
直接的對/proc/kmsg進行讀取(/proc/kmsg是專門輸出核心資訊的地方)
4> klogd的輸出結果會傳送給syslogd進行處理,syslogd會根據/etc/syslog.conf的配置把log 資訊輸出到/var/log/下的不同檔案中.
日誌級別字串:kern_emerg, kern_alert, kern_crit, kern_err, kern_warning, kern_notice, kern_info, kern_debug. printk預設級別是default_message_loglevel(在kernel/printk.c中定義)。當優先順序小於console_loglevel訊息才會顯示出來。
##是乙個連線符號,用於把引數連在一起,例如:
> #define foo(arg) my##arg
> foo(abc) 相當於 myabc
#是「字串化」的意思。出現在巨集定義中的#是把跟在後面的引數轉換成乙個字串,例如:
> #define strcpy(dst, src) strcpy(dst, #src) 則
> strcpy(buff, abc) 相當於 strcpy(buff, "abc")
#undef pdebug /* undef it, just in case */
#ifdef scullc_debug
# ifdef __kernel__
/* this one if debugging is on, and kernel space */
# define pdebug(fmt, args...) printk( kern_debug "scullc: " fmt, ## args)
# else
/* this one for user space */
# define pdebug(fmt, args...) fprintf(stderr, fmt, ## args)
# endif
#else
# define pdebug(fmt, args...) /* not debugging: nothing */
#endif
makefie
ifeq ($(debug),y)
debflags = -o -g -dscullc_debug # "-o" is needed to expand inlines, -d can remove space
else
debflags = -o2
endif
cflags += $(debflags) -i$(lddinc)
有些程序在遇到失敗後會不停的重試,這樣會造成巨量輸出,並可能在控制台裝置較慢時獨佔cpu。printk_ratelimit可以控制一定間隔列印。
if(printk_ratelimit())
printk(kern_notice "the printer is still on fire\n");
//列印裝置編號,下面兩個函式都可以
int print_dev_t(char *buffer, dev_t dev);
char *format_dev_t(char *buffer, dev_t dev);
/proc是由軟體建立的檔案系統,/proc下面每個檔案都繫結乙個核心函式,使用者讀取其中檔案時,該函式動態的生成檔案的內容。建立乙個唯讀檔案時,驅動程式需要實現乙個函式,用於讀取檔案時生成資料。當程序讀取 這個檔案時,讀取請求會通過函式傳送到驅動程式模組。當程序讀取/proc檔案時,核心會分配乙個記憶體頁,驅動程式可以通過其將資料返回給用空間。寫好read_proc函式就要把它和/proc入口連線起來,通過create_proc_read_entry實現。解除安裝模組通過remove_proc_entry實現。
注意:刪除呼叫可能在檔案正在使用時發生,因為/proc入口項不存在關聯的使用者,因此對這些檔案的使用不會作用到模組的引用計數上。
int (*read_proc)(char *page, char **start, off_t offset, int count, int *eof, void *data);
//在scull中就是scullc_read_procmem, start返回實際資料寫到記憶體頁哪個位置。
//第乙個引數是建立的檔名稱,第三個是該檔案所在目錄,null表示在/proc根目錄下
//第5個引數為void *data 是傳給第四個引數執行的函式
create_proc_read_entry("scullcmem", 0 /*mode, 0表示系統預設許可權*/, null, scullc_read_procmem, null);
remove_proc_entry("scullmen", null /*parent dir*/);
int scullc_read_procmem(char *buf, char **start, off_t offset,
int count, int *eof, void *data)
} out:
up (&scullc_devices[i].sem);
if (len > limit)
break;
} *eof = 1;
return len;
}
Linux驅動開發除錯技術之合理使用printk
一 在除錯應用程式時,最常用的除錯技 術是列印,就是在應用程式中合適的 點呼叫printf 當除錯核心 的時 候,可以用 printk 完成類似任務。二 在驅動開發時,printk 非常有助於除錯。但當 正式發行驅動程式時 應當去掉這些列印語句。但你有可能很快又發現,你又需要在驅動程式中實 現乙個新...
linux裝置驅動四(除錯技術)
安裝自己的核心,發行版核心會關閉映像效能的除錯功能,kernel hacking的配置 printk,根據級別或優先順序鎖表示的嚴重程度對訊息進行分類。使用巨集來標示日誌界別,巨集會展開為乙個字串,編譯時和訊息文字拼接在一起,它們之間不需要逗號分割 通過將printk定義為乙個巨集,使用該巨集來列印...
Linux除錯技術
內容 1.熟悉一些常用的除錯技巧 2.熟悉gdb偵錯程式的使用 3.熟悉斷言的使用,4.熟悉記憶體除錯 1.常用除錯技巧 coding完成之後的debg過程 1.1 常見錯誤 a.功能錯誤 需求分析錯誤 b.設計錯誤 程式的架構,設計的資料結構,功能實現方式錯誤 c.code錯誤 編碼錯誤,如 寫成...