2009年9月3日 星期四

kernel 隨手記 --- 類似 oops 的系統訊息

void __this_fixmap_does_not_exist(void)
{
    WARN_ON(1);
}

在 kernel 裡看到這樣的程式碼,用在哪裡呢?
static __always_inline unsigned long fix_to_virt(const unsigned int idx)
{
    if (idx >= __end_of_fixed_addresses)
        __this_fixmap_does_not_exist();

    return __fix_to_virt(idx);
}
(這裡為了精簡,把註解給拿掉了。)這是不希望發生 if 為真的情形,那如果發生了,就印出像 oops 的狀態,以方便偵錯!所以關鍵在 WARN_ON(1),往下追蹤,發現呼叫到 warn_on_slowpath(__FILE__,__LINE__) 來處理,裡面用了幾個好用的技巧:
1.  __builtin_return_address(0) 請 compiler 找出現在 function 的 return address。
2  sprint_symbol() 可以幫忙找出 symbol name , dump_stack() 可以列印現在的 stack 。
3  這個 WARN_ON() 不像 panic() 會中止系統,理論上,可以用來印出發生問題時的 kernel 狀態 ! 或許在開發 driver 可以用來除錯


沒有留言:

張貼留言