您好,登錄后才能下訂單哦!
這篇文章主要介紹Linux內(nèi)核設備驅(qū)動之內(nèi)核調(diào)試技術(shù)的示例分析,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!
/****************** * 內(nèi)核的調(diào)試技術(shù) ******************/
(1)內(nèi)核源代碼中的一些與調(diào)試相關(guān)的配置選項
內(nèi)核的配置選項中包含了一些與內(nèi)核調(diào)試相關(guān)的選項,都集中在"kernel hacking"菜單中。包括:
CONFIG_DEBUG_KERNEL
使其他的調(diào)試選項可用,應該選中,其本身不會打開所有的調(diào)試功能。
具體的調(diào)試選項說明可參見驅(qū)動一書,或通過menuconfig的help說明查看。
(2)如何通過宏對printk調(diào)試語句進行全局控制
通過和Makefile配合,可以在c文件中定義屬于我們自己的調(diào)試語句。
(3)strace的使用
strace可以跟蹤由用戶空間程序所發(fā)出的所有系統(tǒng)調(diào)用。有用的參數(shù)有:
-t 顯示調(diào)用發(fā)生的時間
-T 顯式調(diào)用所花費的時間
-e 限定被跟蹤的系統(tǒng)調(diào)用類型,如"-e execve"
-f 跟蹤所有子進程
-p 跟蹤特定進程。如"-p 8856"
-o 將輸出的信息導入特定的文件
strace對于發(fā)現(xiàn)系統(tǒng)調(diào)用時的細微錯誤非常有用,尤其是針對多進程的程序,可以通過strace輸出的返回值和進程pid獲得大量有用信息。如:
$>strace -o zht.txt -f ./process_create
(4)ltrace的使用
ltrace可以跟蹤由用戶空間程序所發(fā)出的所有動態(tài)庫函數(shù)調(diào)用。有用的參數(shù)有:
-t 顯示調(diào)用發(fā)生的時間
-T 顯式調(diào)用所花費的時間
-f 跟蹤所有子進程
-p 跟蹤特定進程
-o 將輸出的信息導入特定的文件
(5)查看oops消息
oops是內(nèi)核告知用戶有不幸發(fā)生的最常用方式。通常,發(fā)送完oops后,內(nèi)核會處于一種不穩(wěn)定狀態(tài)。
在某些情況下,oops會導致內(nèi)核混亂,而混亂的結(jié)果就是死機,這些情況可能包括:
*oops發(fā)生在持有鎖的代碼中
*oops發(fā)生在和硬件設備通訊的過程中
*oops在中斷上下文中發(fā)生
*oops發(fā)生在idle進程(0)或init進程(1),因為內(nèi)核沒有這兩個進程沒法工作
如果oops在其他進程運行時發(fā)生,內(nèi)核會殺死該進程并嘗試著繼續(xù)運行。oops的產(chǎn)生有很多原因,包括內(nèi)存訪問越界或非法指令等。
oops包含的最重要訊息是寄存器上下文和回溯線索(call trace)可以人為引起oops,如:
if(bad_thing) BUG(); //或 BUG_ON(bad_thing);
可以用panic()引發(fā)更嚴重的錯誤,調(diào)用panic()不但會打印錯誤信息,還會掛起整個系統(tǒng)。只有在極端惡劣的情況下才會使用:
if(terrible_thing) panic("foo is %ld!\n", foo);
有些時候,只要打印一下棧信息就可以幫助測試,如dump_stack():
if(!debug_check){ printk(KERNEL_DEBUG "provide some info\n"); dump_stack(); }
以上是“Linux內(nèi)核設備驅(qū)動之內(nèi)核調(diào)試技術(shù)的示例分析”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對大家有幫助,更多相關(guān)知識,歡迎關(guān)注億速云行業(yè)資訊頻道!
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。