Linux
如何調試 Linux 掛起?
我們正在使用基於 beagle bone black 的定制板,核心版本為 3.12。
我們在一個初始化腳本期間面臨系統掛起,(這會帶來 WiFi)
這個掛起發生在隨機數次電源循環之後,
Nothing works during this hang, it looks like system is frozen, It doesn't even respond to sysrq keys
我認為這在 ISR 程式碼中,因此沒有任何效果。
不幸的是,當我們啟用“檢測掛起的任務(
DETECT_HUNG_TASK
)”時,我們沒有看到問題。:(唯一有效的是,如果在看門狗計時器到期後啟用看門狗,它會重新啟動系統並恢復系統。
但是,我們想找出問題所在。
有什麼建議嗎?
我想過使用軟狗和修復腳本對來列印一些消息,但我認為外部中斷將具有更高的優先級,當它執行並掛在那裡時,軟狗定時器也不會有機會執行嗎?
錯誤的隨機性使得調試變得更加困難:(
任何幫助表示讚賞。
好吧,我們按照評論中的建議進行了程式碼閱讀,並找到了更新檔中系統可能進入無限循環(在 irq 中)並且不會退出的部分。
但是,當我們將 printk 放入該 irq 函式時,問題並沒有被複製。(你知道的時間問題!)
所以最後我的同事嘗試了切換 GPIO 的老式方法,它有所幫助。這也很困難,因為兩個以上的 GPIO 切換條目會阻止重現問題。
在函式內部,他使用 GPIO 切換如下,
func() { //set gpio high some doubtfull code.. .... //set gpio low }
這就是他跟踪有問題的程式碼的方式,它的解決方案在 linux-4.1 中可用,他修復了它,他正在測試它。
@ShankarSM:如果你正在閱讀這篇文章,所有的功勞都歸功於你追踪它:-)