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 可以用來除錯
{
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 可以用來除錯
沒有留言:
張貼留言