(一) 打印內核調試信息:printk
Printk函數用法與printf函數類似,只不過printk函數運行在內核空間,printf函數運行在用戶空間,printk函數在printk.c文件中實現。
Printk函數的原型如下:asmlinkage int printk(const char *fmt,...)
第1個參數表示格式字符串,后面是可變參數。第一個參數值前面加尖括號包含的數字表示輸出的日志級別,共有8個級別,在linux/kernel.h頭文件中定義。
不管消息級別是多少,所有通過printk函數發出的消息都會輸出到日志文件(就算有的消息輸出到控制台,也會同時輸出到日志文件)。可以通過如下的命令查詢日志
消息 #dmesg
(二) 防止printk函數降低Linux驅動性能
雖然使用printk函數可以很方便地將消息寫入日志文件或控制台。但大量使用printk函數頻繁操作日志問阿金或控制台設備文件會嚴重影響Linux驅動的性能。因此,這就要求Linux驅動只在開發階段使用printk函數輸出消息,在正式發布Linux驅動時將可能影響性能的printk函數去掉。最好的方法無疑是利用C語言中的編譯指令。(#if、#else、#endif等)。如果不想使用printk輸出消息,只要將#if中的1改為0即可不使用printk輸出消息。
(三) 通過虛擬文件系統(/pron)進行數據交互
/pron用來作為內核空間與用戶空間進行數據交互的工具,它的文件系統的行為凡是與設備文件系統(/dev)類似,/pron是虛擬文件系統,是內存映射,所有讀寫/pron的操縱都是對內存的讀寫,因此,它也可以作為Linux驅動與用戶空間程序交互的工具。
/pron 文件系統主要通過proc_dir_entry.read_proc和proc_dir_entry.read_write函數指針來設置讀寫/pron目錄中的虛擬文件的動作處理函數,proc_dir_entry結構體代表一個虛擬目錄或文件
(四) 調試工具
Linux系統中提供了一類工具,這些工具可以逐行跟蹤程序的代碼,這些工具包含用於調試用戶空間程序的gdb、gdbserver和調試內核空間程序的kgdb
- gdb調試用戶空間程序
gdb可以跟蹤調試用戶空間的程序,只能在PC上進行測試
2.gdbserver遠程調試用戶空間程序
用gdbserver 測試運行在開發板、手機或Android模擬器上的程序。gdbserver是一個可以運行在ARM架構上的服務端程序,在開發板上使用gdbserver打開要測試的程序,然后通過串口、有線或無線網絡可以在PC上進行調試
3.kgdb遠程調試內核程序
最好的內核調試工具。提供類似printk函數的復制輸出功能,允許開發人員直接在PC上通過GDB鏈接目標設備