一、想要成功進行調試:linux
2、內核中的buggit
從隱藏在源代碼中的錯誤到展示在目睹者面前的bug,每每是經歷一系列連鎖反應的事件纔可能觸發的。內核確實有一些獨特的問題須要考慮,像定時限制和競爭條件等,它們都是容許多個線程在內核中同時運行產生的結果。ide
3、經過打印來調試
內核提供的打印函數printk()和C 庫提供的printf()函數功能幾乎相同。函數
一、健壯性oop
二、日誌等級spa
三、記錄緩衝區線程
四、syslogd 和klogd調試
4、oops日誌
一、ksymoops
若是使用的是模塊, 還須要一些模塊信息。ksymoops 一般會自行解析這些信息,調用後獲得解碼板的oops隊列
ksymoops saved_ oops. txt
二、kallsyms
5、內核調試配置選項
內核開發( Kernel hacking)菜單項中,它們都依賴於CONFIG_DEBUG_KERNEL。。其中最有用的一個是sleep-inside-spinlock-checking (自旋鎖內睡眠選項)。使用鎖時睡眠是引起死鎖的元兇。因此,包括正使用鎖的時候調用,正使用鎖的時候以阻塞方式請求分配內存和在引用單CPU 數據時睡眼在內,各類潛在的bug 都可以被探測到。
6、引起bug 並打印信息
最經常使用的兩個是BUG() 和BUG_ON()。當披調用的時候,它們會引起oops ,致使栓的回溯和錯誤信息的打印能夠把這些調用當作斷言使用,想要斷言某種狀況不應發生:
if (bad_thing)
BUG();
或者使用更好的形式:
BUG_ON (bad_thing);
多數內核開發者相信BUG_ON()比BUG()更清晰、更可讀, 並且BUG_ON()會將其聲明做爲一個語句放入unlikely()中。
能夠用panic()引起更嚴重的錯誤。調用panic()不但會打印錯誤消息,並且還會掛起整個系統。顯然,只應該在最糟糕的狀況下使用它
if (terrible_thing)
panic ( 」 terrible thing is %ld\n 」, terrible_thing);
7、內核調試器的傳奇
一、gdb
gdb vml inux /proc/kcore
【其中vmlinux 文件是未經壓縮的內核映像,不是壓縮過的zlmage 或bzlmage,它存放在源代碼樹的根目錄上。】
二、kgdb
一開始,你得告訴Git 你要進行二分搜索:
$ git bisect start
而後再爲Git 提供一個出現問題的最先內核版本:
$ git bisect bad <revision>
若是當前的內核版本就是引起bug的罪魁禍首,那麼就沒必要提供內核版本:
$ git bisect bad
而後,還得爲Git 提供一個最新的可正常運行的內核版本:
$ git bisect good v2.6.28
若是這個版本一切正常,能夠運行下面的命令:
$ git bisect good
若是這個版本運行有異常一一也就是說,若是證實這個給定的內核版本有bug,能夠運行:
$ git bisect bad
若是你已經知道引起bug 的源(好比, x86 機型的啓動代碼),你能夠指定git僅僅在與錯模相關的目錄列表中去二分搜索提交的補丁。
$ git bisect start - arch/x86