2010/06/12

回憶起一個很難抓的臭蟲

很久很久以前,那個時候沒有iPhone、沒有Android、iPod還很大一台的時候,記得當時我的工作是在手機平台上寫程式,已經算是半熟的新人了,對於整個系統有了初步的掌握,已經可以愉快地獨自工作,不用別人的幫忙了。後來進來了一個新人,本來他跟我不同小組,不太會有交集,但同為年資最少的菜鳥,有幾個禮拜的時間我們倆被叫去品保部門支援,起初我有點小小不高興,認為那是苦力工作,不過上級有令只好遵從,我叫咱們是悲情苦命小工程師,不過後來發現那是段很不錯很有用的經驗,至少去支援的時候認識幾個正妹,嘿嘿;總而言之,在如此的因緣際會之下,後來他常常找我去幫他除錯抓臭蟲(debug),因為實在太沒效率(聊天太大聲)、浪費人力(兩人解一題)而且又跨界管事(有應該帶他的人),沒多久就被我主管禁止,雖然大部分的問題都是因為他還不熟平台以及各種API,但還是有少數幾個很難解的bug,以下就是其中之一。

聽說"debug"這個詞的由來,是真的在電腦裡面找的一隻蟲(bug),哇!


他開始負責維護安全認證方面的程式碼,譬如SIM卡可以設定密碼,開機時要輸入,不然就只能打緊急電話(No SIM),而且打錯太多次,SIM還會被鎖起來。其實功能大體上都好了,不過還有bug,帶他的人就交給他解解看,說了這麼久,到底是什麼bug呢?

BUG:開機時輸入正確的SIM卡密碼,有時候正常開機,有時候卻整個重開機。

哇哩咧,老實說,以我多年闖蕩江湖上斬北海蛟龍下劈南山猛虎的輝煌戰績看來,這種bug最難解的啦!有時候出現,有時候不出現,羚羊掛角,無跡可尋,搞不清楚狀況,一整個完蛋。

SIM卡小小一片,讓你幾乎讓了它的存在。


還好小弟在下不才我是有練過的,劣者我用壞螢幕的速度可追讀書破萬卷的杜甫,打爛鍵盤的數量可比寫黑一池水的王羲之;我一試之下果然有鬼,手機時好時不好,腦中閃過幾個可能,然後再看看程式碼,心理已經有個底,於是乎我告訴他說:我抓到規則了,只要你開機,看到輸入密碼的畫面就用很快的速度輸入密碼按確定,那就有可能會重開機,可是如果你等個幾秒鐘,然後才輸入按確定,那就平平安安。哇賽,真是太佩服我自己了,然後就跟他說只能幫到這回座位了,留下他一臉狐疑直說怎麼可能會這樣,慢慢苦戰吧,呵呵。

金田一跟柯南到底誰比較強啊?我以我爺爺的名號發誓,真相只有一個!如果debug能夠跟他們倆解謎一樣厲害,那就好囉。


那到底原因是什麼呢?還好我有看過Scott Meyers的Effective C++: 55 Specific Ways to Improve Your Programs and Designs,知道裡面有這麼一條寫著:the relative order initialization of non-local static objects in different translation units is undefined,啥?

PS 在這本書第三版出現在Item 4,第二版出現在Item 47。

用書中的C++例子來說明:


class FileSystem { ... };

FileSystem theFileSystem;

在某個檔案定義了一個類別FileSystem,並且有一個global static的物件theFileSystem。

然後在另外的檔案:

class Directory {
public:
Directory();
...
};

Directory::Directory()
{
//會使用theFileSystem這個物件
}

Directory theDir;

同樣也有一個global static的物件theDir,而且這個物件的constructor需要用到另一個global static物件theFileSystem來做初始化的動作,問題是,你怎麼知道theFileSystem會在theDir之前就先準備好呢?

答案是:你不能,theFileSystem跟theDir,皆為non-local static物件,其執行各自的constructors的順序是沒有定義的。所以當theDir執行constructor時,如果theFileSystem還沒,那就當然會當機或重開機了。

所以我猜,當手機開機開到輸入密碼時,背景其實還在跑很多其他的東西,此時如果快速輸入密碼按確定,就有可能會去用到還沒有準備好的物件,造成重開機;但如果等一等,那就沒事。

哇,這真是太神奇了。

至於怎麼解決這樣的問題,那就請你看看書囉,好書,值得推薦,另外還有姊妹作More Effective C++: 35 New Ways to Improve Your Programs and Designs,學 C++不可錯過的著作喔。

8 comments:

  1. 桂小太郎26/6/10 17:47

    很好奇的問一個問題,對從事理工相關行業的人來講,閱讀文史哲學類的書會有幫助嗎?

    ReplyDelete
  2. 很多大師都說,寫程式跟寫文章一樣,寫程式應該要給人看而不是給機器看。

    我不是大師,沒能體會那種境界。

    我覺得哲學滿有用的啊;但是文史的話,光讀沒什麼關連吧,不過如果有寫的話,那可能會有點小幫助。

    ReplyDelete
  3. 桂小太郎27/6/10 11:44

    為什麼唸哲學會對寫程式有幫助呢?邏輯有一樣嗎?

    ReplyDelete
  4. 嗯,怎麼說呢?如果是“邏輯”的部份,那當然很有幫助,邏輯是true or false,電腦是0跟1嘛,if then else,如果是就這樣,要不然就那樣;不懂邏輯不能寫程式啊。

    至於哲學,我覺得是因為,哲學都是很抽象的思考,能夠搞清楚而不會讓自己陷入混亂的狀態,這大概可以算是一種訓練,鍛鍊思考的能力;或者可以說學哲學對所有學科領域都有幫助吧^_^。

    ReplyDelete
  5. 桂小太郎27/6/10 15:46

    我們一般人會覺得唸理工的人大概比唸文組的人要聰明,你覺得呢?

    ReplyDelete
  6. 咳咳,好難的問題。可以讓我先反問你“聰明”的定義是什麼嗎?

    假設在唐朝時,李白寫了一首很美的詩,另外有人監造了堤防工程,你覺得誰比較聰明呢?

    當一個理科人才,發明或創新了什麼技術或科技,大家會說“好聰明”啊,可是一個文人,如果寫了一本震驚或感動世界的書,我們通常不是用聰明來形容他,可是,要寫出那樣的書不需要聰明嗎?

    根據龍櫻(東大特訓班)說法,一年準備就可以上東大理科,可是文科就不行了,你覺得哪邊比較聰明呢?

    抱歉,沒有答案。

    ReplyDelete
  7. 桂小太郎27/6/10 17:31

    我想大部份的人應該是用能不能賺比較多錢來衡量聰不聰明吧。所以比如說在科舉時代會寫文章的人大概就被認為比較聰明,中國古代的科學家應該沒有文學家地位高,不過現在可以靠寫文章賺大錢的人應該不多。
    現在的話,看平均薪資還有大學選填志願的排行,也許就可以得到錢賺比較多或校系排名在比較前面比較聰明的結論吧。
    還有如果是台灣的大學的話,我知道很多人理組轉文組只念半年不到就可以念台大排名在前的科系,文組轉理組應該很少吧。
    所以我想大概是錢賺比較多的人被認為比較聰明,那理工的畢業生平均薪資比文組高(單就平均薪資而言),所以會得到結論是理科的學生比較聰明。不過當然這牽涉到就業市場的供需問題。

    ReplyDelete
  8. 來針對主題回應一下...

    請參考小弟的 這系列 的文字

    ReplyDelete