1. 程式人生 > >遇到“BUG: soft lockup

遇到“BUG: soft lockup

之前開發的抓包模組上線後有客戶反饋有丟包問題,這兩天在定位這個丟包問題,抓包模組由我和另一名“隊友”負責,我負責底層抓包開發,他負責接收處理。在測試丟包問題的時候,他遇到一個板子連不上的情況,問我咋回事,剛好看到了log列印一行,

[27468.016028] BUG: soft lockup - CPU#1 stuck for 22s! [hagnatsd:1782]
HELLO! BOOT0 is starting!
boot0 version : 4.0.0
rtc[1] value = 0x00010000

一看就是核心軟鎖死,然後系統重啟了。這個問題比較嚴重,如果模組有問題不影響系統執行還算小事,但系統掛了那就算大事了。當時也是一頭霧水,用了那麼久,怎麼突然跑出來這樣的問題。看問題應該是程式碼裡面原子鎖的使用問題,導致系統鎖死,程式碼比較多,一時半會兒又走讀不過來,於是就嘗試復現這個問題。瞎搞了兩個小時, 功夫不負有心人 (⊙_⊙) ,終於又出現了一次, 同樣是鎖死

[  688.008033] BUG: soft lockup - CPU#0 stuck for 22s! [quickstart:2532]
[  723.231005] INFO: rcu_preempt self-detected stall on CPU
[  723.232008] INFO: rcu_preempt detected stalls on CPUs/tasks: { 0} (detected by 3, t=60002 jiffies)
[  723.232024] INFO: Stall ended before state dump start
[  723.231005] Backtrace for cpu 0 (current):
[  723.231005] 
[  723.231005] sending IPI to all other CPUs:
[  723.265047] IPI backtrace for cpu 2
[  723.266009] IPI backtrace for cpu 1
[  723.271893] IPI backtrace for cpu 3
[  723.273107] IPI backtrace for cpu 5
[  723.266009] IPI backtrace for cpu 7
[  723.266009] IPI backtrace for cpu 6
[  723.295307] IPI backtrace for cpu 4
[  760.144028] BUG: soft lockup - CPU#4 stuck for 22s! [swapper/4:0]
[  787.618047] CIFS VFS: Server 172.25.1.90 has not responded in 120 seconds. Reconnecting...
[  903.236006] INFO: rcu_preempt self-detected stall on CPU
[  903.237012] INFO: rcu_preempt detected stalls on CPUs/tasks: { 0} (detected by 6, t=240007 jiffies)
[  903.237028] INFO: Stall ended before state dump start
[  903.236006] Backtrace for cpu 0 (current):
[  903.236006] 

於是分析了自己的操作步驟,將程式碼流程分開,一步一步測試,最終問題定位到一處程式碼BUG, 程式走到死迴圈導致外部的讀寫鎖無法釋放,修改後得以解決。

總結經驗就是平常遇到這類問題一定要重視,千萬不要放過,就算不能解決也要找boss聊一聊其它方案。不然等到了客戶那邊問題會更大,而且不在現場更不方便除錯。其次就是仔細分析問題產生現象,嘗試重現問題,再結合具體的程式碼流程分析,類似這種軟鎖死問題基本上就是自身程式碼邏輯問題,仔細走讀程式碼,分析程式碼流程 一步一步測試,最終定位問題根源才會徹底解決問題。