/******************
* 內核的調試技術
******************/
(1)內核源代碼中的一些與調試相關的配置選項
內核的配置選項中包含了一些與內核調試相關的選項,都集中在"kernel hacking"菜單中。包括:
CONFIG_DEBUG_KERNEL
使其他的調試選項可用,應該選中,其本身不會打開所有的調試功能。
具體的調試選項說明可參見驅動一書,或通過menuconfig的help說明查看。
(2)如何通過宏對printk調試語句進行全局控制
通過和Makefile配合,可以在c文件中定義屬于我們自己的調試語句。
(3)strace的使用
strace可以跟蹤由用戶空間程序所發出的所有系統調用。有用的參數有:
- -t 顯示調用發生的時間
- -T 顯式調用所花費的時間
- -e 限定被跟蹤的系統調用類型,如"-e execve"
- -f 跟蹤所有子進程
- -p 跟蹤特定進程。如"-p 8856"
- -o 將輸出的信息導入特定的文件
strace對于發現系統調用時的細微錯誤非常有用,尤其是針對多進程的程序,可以通過strace輸出的返回值和進程pid獲得大量有用信息。如:
$>strace -o zht.txt -f ./process_create
(4)ltrace的使用
ltrace可以跟蹤由用戶空間程序所發出的所有動態庫函數調用。有用的參數有:
- -t 顯示調用發生的時間
- -T 顯式調用所花費的時間
- -f 跟蹤所有子進程
- -p 跟蹤特定進程
- -o 將輸出的信息導入特定的文件
(5)查看oops消息
oops是內核告知用戶有不幸發生的最常用方式。通常,發送完oops后,內核會處于一種不穩定狀態。
在某些情況下,oops會導致內核混亂,而混亂的結果就是死機,這些情況可能包括:
- *oops發生在持有鎖的代碼中
- *oops發生在和硬件設備通訊的過程中
- *oops在中斷上下文中發生
- *oops發生在idle進程(0)或init進程(1),因為內核沒有這兩個進程沒法工作
如果oops在其他進程運行時發生,內核會殺死該進程并嘗試著繼續運行。oops的產生有很多原因,包括內存訪問越界或非法指令等。
oops包含的最重要訊息是寄存器上下文和回溯線索(call trace)可以人為引起oops,如:
if(bad_thing)
BUG();
//或 BUG_ON(bad_thing);
可以用panic()引發更嚴重的錯誤,調用panic()不但會打印錯誤信息,還會掛起整個系統。只有在極端惡劣的情況下才會使用:
if(terrible_thing)
panic("foo is %ld!\n", foo);
有些時候,只要打印一下棧信息就可以幫助測試,如dump_stack():
if(!debug_check){
printk(KERNEL_DEBUG "provide some info\n");
dump_stack();
}
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對腳本之家的支持。如果你想了解更多相關內容請查看下面相關鏈接