[BUG_ON()] It's not a "let's check that everybody did things right",
it's a "this is a major design rule in this core code".
"good BUG_ON() in solid code that has been around forever" and "bad
BUG_ON() checking something that we know we might be getting wrong".
by Linus Torvald
Linus Torvalds 在釋出 4.8 後,很快地發現 kernel 在開啟 CONFIG_DEBUG_VM 時,容易會讓 kernel panic。[1]
原因是因為在 VM 的程式碼中,在檢查到某個異常情況時,VM_BUG_ON()會使用 BUG_ON()。
根據該筆修改的 Johannes Weiner 說法,他的程式碼只會在 CONFIG_DEBUG_VM 時使用 BUG_ON(),所以認為對一般使用者不會有影響才對。
並且,作者認為,如果已經遇到了異常情況,卻不用 BUG_ON() 將系統停住,不就讓系統的行為更無法預期、更難 debug 了嗎? [ 2 ]
Linus 很快地回了一封 mail ,說明 BUG_ON() 的少數使用時機:
- 開發者的測試環境
對 error handling 還沒想清楚,但是覺得某個地方絕不該發生,通常只應該在 [RFC] 階段,大概對應開發階段的 UT。
然而,即使開啟了 CONFIG_DEBUG_VM,也不該就讓 BUG_ON() 進入,因為對使用者來說,開啟這個選項是想獲得更多訊息,
而不是讓 kernel 死亡。
這類的 BUG_ON() 經過一些測試後,就應該拿掉。
2. 非常核心的程式碼
如果是非常核心、基礎的程式碼,發現該錯誤時,可以明確知道系統絕對跑不下去,也可以用 BUG_ON() 。比如說:如果檢查到
stack corruption,表示連 return 都會 fail ,所以這時就可以 BUG_ON()。
而如果是第二種情況,就應該思考是否在進入到會 BUG_ON() 前,就有足夠多的 WARN_ON() 可以提早捕捉到不該出問題的狀態。
否則,如果只有 BUG_ON() ,也幾乎沒有太多的除錯訊息可看。
Linus 的 PDCA:
- 自己沒有對即將釋出的最後版本作即時的反應 - BUG_ON() 不該隨意引入。
- 開發者對 error handling 的認知不足。
Johannes Weiner 很快地也找出了復現手法,並修正了此問題。[4] 算是 happy ending,不過也反應出 error handling 真的要很小心進行判斷。 XD
Reference:
留言
張貼留言