1、核心中的除錯
開發中需要啟用的配置選項
config_debug_kernel
config_debug_slab
config_debug_pagealloc
config_debug_spinlock
config_debug_spinlock_sleep
config_init_debug
config_debug_info
config_magic_sysrq
config_debug_stackoverflow
config_debug_stack_usage
config_kallsyms
config_ikconfig
config_ikconfig_proc
config_acpi_debug
config_debug_driver
config_scsi_constants
config_input_evbug
config_profiling
2、用列印除錯
最常用的除錯技術是監視,在程式的適當地方呼叫printk。
printk允許你根據訊息的嚴重程度不同進行分類。
printk(kern_debug"hereiam:%s:%i\n",__file__,__line__);//除錯資訊
printk(kern_crit"i'mtrashed;givingupon%p\n",ptr);//緊急資訊
一共有八種情況等級:
kern_emerg
用於緊急訊息,常常是那些崩潰前的訊息.
kern_alert
需要立刻動作的情形.
kern_crit
嚴重情況,常常與嚴重的硬體或者軟體失效有關.
kern_err
用來報告錯誤情況;裝置驅動常常使用kern_err來報告硬體故障.
kern_warning
有問題的情況的警告,這些情況自己不會引起系統的嚴重問題.
kern_notice
正常情況,但是仍然值得注意.在這個級別一些安全相關的情況會報告
kern_info
資訊型訊息.在這個級別,很多驅動在啟動時列印它們發現的硬體的資訊.
kern_debug
用作除錯訊息
沒有指定優先順序的printk語句預設是default_message_loglevel即kern_warning
根據記錄級別,核心列印的訊息可能輸出的位置不同。
可以修改核心訊息的級別,使核心訊息出現在控制台:
echo8>/proc/sys/kernel/printk
3、用查詢來除錯
雖然使用printk很方便,但大量使用printk會拖慢系統。
/proc檔案系統是乙個特殊的軟體建立的檔案系統,用來將核心的訊息輸出到外界,/proc下的每個檔案都繫結到乙個核心函式上。
4、使用查詢來除錯
strace命令時乙個有力工具,顯示所有的使用者空間程式發出的系統呼叫.它不僅顯示呼叫,還以符號
形式顯示呼叫的引數和返回值.當乙個系統呼叫失敗,錯誤的符號值(例如,enomem)和對應的字
串(outofmemory)都顯示.strace有很多命令列選項;其中最有用的是-t來顯示每個呼叫執行的時
間,-t來顯示呼叫中花費的時間,-e來限制被跟蹤呼叫的型別,以及-o來重定向輸出到乙個檔案.缺
省地,strace列印呼叫資訊到stderr
使用命令:stracels/dev>/dev/scull0
5、除錯系統故障
即便你已使用了所有的監視和除錯技術,有時故障還留在驅動裡,當驅動執行時系統出錯.當發生這個時,能夠收集盡可能多的資訊來解決問題是重要的。
ldd3學習之四 除錯技術
核心中的除錯支援 核心開發者一般都已經建立了多項用於除錯的功能。但是由於這些功能會造成額外的輸出,並導致能下降,因此發行版廠商通常會禁止發行版核心中的除錯功能。為了實現核心除錯,我在核心配置上增加了幾項 kernel hacking magic sysrq key kernel debugging ...
LDD3學習筆記(11) 記憶體分配
kmalloc分配記憶體快並且不清零獲得的記憶體區,記憶體區保留它原來的內容,分配的區在物理記憶體中連續。include void kmalloc size t size,int flags void kfree void obj 記憶體分配的最常用介面.include gfp user gfp k...
LDD3學習筆記 模組的編譯
新手上路,ldd3學習之旅開始,以下內容純屬筆記,若有錯誤,望見諒!1.什麼是 模組 可以在系統執行時加入到核心中的 故 模組包括但不限於裝置驅動程式。2.如何寫乙個模組?1 c檔案 2 實現module init,module exit3.ldd3中makefile編寫規則 照搬 ifneq ke...