linux內核中的BUG和BUG_ON
2015/07/21 13:45
瀏覽2,125
迴響0
推薦0
引用0
在內核代碼中,經常會看到一些調試函數,如BUG,BUG_ON等。
使用前,先在內核配置中把kernel debug選上:
make menuconfig:
kernel hacking-->
kernel debug
作用:一些內核調用可以用來方便標記bug,提供斷言並輸出信息。最常用的兩個是BUG()和BUG_ON()。當被調用的時候,它們會引發oops,導致棧的回溯和錯誤信息的打印。為什麽這些聲明會導致 oops跟硬件的體系結構是相關的。大部分體系結構把BUG()和BUG_ON()定義成某種非法操作,這樣自然會產生需要的oops。你可以把這些調用當作斷言使用,想要斷言某種情況不該發生 :
if (bad_thing)
BUG();
或者使用更好的形式:
BUG_ON(bad_thing);//BUG_ON是一個函數接口,一般開發人員自己實現相關函數內容,一般用來判斷內核是否出現問題,如果參數為真的話,證明內核出現了//bug,打印BUG信息,然後調用PANIC函數,讓系統panic。
可以用panic()引發更嚴重的錯誤。調用panic()不但會打印錯誤消息而且還會掛起整個系統。顯然,你只應該在極端惡劣的情況下使用它:
if (terrible_thing)
panic("foo is %ld/n", foo);
有些時候,你只是需要在終端上打印一下棧的回溯信息來幫助你測試。此時可以使用dump_stack()。它只在終端上打印寄存器上下文和函數的跟蹤線索:
if (!debug_check) {
printk(KERN_DEBUG "provide some information.../n");
dump_stack();
}
使用前,先在內核配置中把kernel debug選上:
make menuconfig:
kernel hacking-->
kernel debug
作用:一些內核調用可以用來方便標記bug,提供斷言並輸出信息。最常用的兩個是BUG()和BUG_ON()。當被調用的時候,它們會引發oops,導致棧的回溯和錯誤信息的打印。為什麽這些聲明會導致 oops跟硬件的體系結構是相關的。大部分體系結構把BUG()和BUG_ON()定義成某種非法操作,這樣自然會產生需要的oops。你可以把這些調用當作斷言使用,想要斷言某種情況不該發生 :
if (bad_thing)
BUG();
或者使用更好的形式:
BUG_ON(bad_thing);//BUG_ON是一個函數接口,一般開發人員自己實現相關函數內容,一般用來判斷內核是否出現問題,如果參數為真的話,證明內核出現了//bug,打印BUG信息,然後調用PANIC函數,讓系統panic。
可以用panic()引發更嚴重的錯誤。調用panic()不但會打印錯誤消息而且還會掛起整個系統。顯然,你只應該在極端惡劣的情況下使用它:
if (terrible_thing)
panic("foo is %ld/n", foo);
有些時候,你只是需要在終端上打印一下棧的回溯信息來幫助你測試。此時可以使用dump_stack()。它只在終端上打印寄存器上下文和函數的跟蹤線索:
if (!debug_check) {
printk(KERN_DEBUG "provide some information.../n");
dump_stack();
}
限會員,要發表迴響,請先登入


