客戶報了一個bug,在執行Android的板子上,一個USB硬碟反復熱插拔,最終會導致硬碟被格式化。
一開始,所有人都不以為然,你一個硬碟反復熱插拔那麽多次有病啊。
可是不久,客戶另一個硬碟也同樣被格式化了。
事件極速升級
所有的領導都開始盯著了
然後,我們工程師開始重視這個bug
解bug第一步當然是復現,我們發現,連續熱插拔三千次以後,就100%復現這個問題。媽的每次都是三千次以後,真的手累
第二步加打印資訊narrow down,但是因為無法想清楚問題在哪裏,所有只能大海撈針,在android的程式碼和linux的程式碼裏都加各種打印。
然後那段時間,我們的工作狀態就是:
加打印資訊 -> 瘋狂插拔 幾個小時之後,大叫一聲「我靠」,再去分析,繼續加打印資訊,繼續瘋狂插拔,繼續我靠。。。。。
那段時間晚上回家連擼的欲望都沒得
最終經過幾周之後,終於將問題解掉了。
發現的過程太過曲折離奇,一時半會根本說不清楚,問題的根源,說出來就氣人,一個工程師在內核裏把一個參照definition的地方給hard code了。。。。。
從那以後,manager痛定思痛,迅速部署了gerrit
------------------------12/19更新
鑒於很多人出招如何更輕松的復現這個問題,有說USB加開關的,有說用機械臂的,有說連數碼開關的,首先謝謝大家的提議。
但是我想補充的是,在當時那樣的情況下,客戶天天喊著量產被耽擱,自己的領導和領導的領導每隔幾個小時就跑過來問進度,郵件的cc裏已經出現了VP級別的人,我還能怎麽樣?我去找人開發一個機械臂?我去淘寶上買一個USB開關?就算馬上就得到了這個USB開關,然後過了半天之後,不能復現怎麽辦?是分析USB開關的問題呢還是回到我自己的問題?在那種高壓之下,我是萬萬不能再去引入額外的變量,如果引入之後問題發生了新的情況,我怎麽辦?
我隨便一折騰就是一天過去了,領導和客戶的耐心又減半了。。。我怎麽辦?我告訴他們我在折騰機械手臂?are you kidding?我沒有辦法,我只能以最穩妥的方式,一步一個腳印的去把問題理清去解決,給客戶一個交代。
其實,如果有充足的時間,沒人盯著沒人催著,我的辦法太多了,我都根本不需要那些輔助的東西,我對driver隨便改改就能模擬插拔了,我甚至都不需要連一個真實的硬碟,我分分鐘就能模擬一個硬碟出來。我起初做linux和android的時候,我啥都沒有,就一台電腦。
作為工程師永遠有很多辦法,但是對某一個特定問題,只有一個最優的辦法。