原文:
http://www.cnitblog.com/textbox/articles/61881.html這些天來弄了一個簡單的驅(qū)動模塊,后發(fā)現(xiàn)系統(tǒng)只要一卸載模塊系統(tǒng)就會死掉。到底是那里出了錯?
如果你只是通過printk來調(diào)試, 而沒有其他的方法去檢測錯誤的。
也是這個原因促使我寫驅(qū)動模塊調(diào)試技術(shù)相關(guān)技術(shù)。要學(xué)好一個編程語言工具首先調(diào)試技術(shù)也一定同步。
(如果linux 也能做出一個類似windows 下的 Windbg 或
Soft-ICE 那就不必那么麻煩了)
這篇文章不是一氣呵成的,只是我在學(xué)習(xí)內(nèi)核調(diào)試的一個筆記。
調(diào)試技術(shù)有以下幾種:
1.用打印調(diào)試
2.文件保存調(diào)試信息
3.truss、strace和ltrace命令輸出信息來調(diào)試
4.調(diào)試器來調(diào)試
對于第一種 “用打印調(diào)試 ”
利用函數(shù)或命令把相應(yīng)的信息輸出到console或文件內(nèi)
這些函數(shù)有 printk , STOCLINUX 等等
prink 的一般用法是定義成一個公用的宏
#undef PDEBUG /* undef it, just in case */
#ifdef SCULL_DEBUG
#ifdef __KERNEL__
/* This one if debugging is on, and kernel space */
#define PDEBUG(fmt, args
) printk( KERN_DEBUG "scull: " 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
#undef PDEBUGG
#define PDEBUGG(fmt, args
) /* nothing: it's a placeholder */
在makefile 里面添加
DEBUG = y
# Add your debugging flag (or not) to CFLAGS
ifeq ($(DEBUG),y)
DEBFLAGS = -O -g -D SCULL_DEBUG # "-O" is needed to expand inlines
else
DEBFLAGS = -O2
endif
CFLAGS += $(DEBFLAGS)
這樣定義的宏可以在內(nèi)核模式和用戶模式在 Debug 版本下輸出調(diào)試信息,而在release版本編譯時候去掉調(diào)試輸出的函數(shù)代碼。
并可以通過設(shè)置makefile就可以是否輸出調(diào)試信息,
缺點是修改makefile還需要重新編譯一次。
想法,如果能給模塊一個配置文件 (*.conf)那就修改配置文件就不用重新編譯,只需要卸載安裝模塊就實現(xiàn)調(diào)試信息的輸出,
缺點是影響系統(tǒng)的性能。
對於第二種 “文件保存調(diào)試信息 ”
內(nèi)核模式下可以使用 /proc文件系統(tǒng) 或者 seq_file 來記錄調(diào)試信息。創(chuàng)建自己的/proc文件系統(tǒng)的文件 或 seq_file 文件 并記錄相應(yīng)的調(diào)試信息,用于查詢。
seq_file 操作可以參考 http://blog.chinaunix.net/u/12313/showart_172686.html;
還有 用ioctl 命令。這些命令可以從驅(qū)動模塊拷貝相關(guān)的數(shù)據(jù)結(jié)構(gòu)到用戶空間, 用于查詢它們,缺點是需要用另外的程序來發(fā)出和顯示調(diào)試信息,并增加模塊的體積 。優(yōu)點是比/proc塊
oops消息 ,通常消息發(fā)生于引用了 NULL 指針或者使用其他不正確指針值。
調(diào)試器
使用 gdb
優(yōu)點:比較適用于用戶模式下調(diào)試程序,linux自帶無需重新安裝
缺點:不適合內(nèi)核模塊的調(diào)試(也可以內(nèi)核調(diào)試,利用它的遠程調(diào)試功能。需要兩臺電腦)
主要步驟是
1.執(zhí)行 #gdb program
2.執(zhí)行到mian():#start
3.設(shè)置斷點
4.調(diào)試
具體命令使用: 參考 http://baike.baidu.com/view/639266.htm
使用kdb
優(yōu)點:不需要遠程調(diào)試
缺點:不支持源代碼級別上的調(diào)試只能使用匯編級別的調(diào)試,需要重新下載安裝包,安裝需要重新編譯內(nèi)核激活kdb
使用 kgdb
優(yōu)點:可以對內(nèi)核進行全方面的調(diào)試 (感覺有點類似 windows 下的WinDdg)
缺點:需要兩臺電腦,配置復(fù)雜 ,更新慢,到目前位置最高只能支持2.6.15.5 版本的內(nèi)核
使用Linux Trace Toolkit
使用Dynamic Probes ( DProbes )
使用
SkyEye 優(yōu)點:
ARM Simulator很好地結(jié)合在了一起 主要用于嵌入式驅(qū)動開發(fā)領(lǐng)域 缺點:配置文件設(shè)置復(fù)雜
使用 UML (虛擬機類似)
優(yōu)點:
UML適合于調(diào)試那些處理與硬件無關(guān)的驅(qū)動程序缺點:
UML并不適合于調(diào)試那些處理實際硬件的驅(qū)動程序使用
JTAG- based debuggers優(yōu)點:
The JTAG (Joint Test Action Group) based debuggers are hardware assisted and powerful tools缺點:
but are expensive.