Linux驅動 3 除錯技術和 prop

2021-08-22 08:29:47 字數 2895 閱讀 7996

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錯誤 編碼錯誤,如 寫成...