2010/06/13

回憶起一次出包經驗

很久很久以前,工作內容是在手機平台上寫程式,曾經出過一次包,當時六神無主,手足無措,因為執行到我的程式就當機,更慘的是一點概念都沒有,不知道哪裡錯了,一當機就驚醒我夢中人,嚇的我屁滾尿流失了魂,。

後來,光用看的看不出所以然,就把改過的跟原來正常的版本作比較,但也還是不知道錯在哪,於是出動硬體偵錯的工具,邊執行邊追,一行一行追,終於得知問題所在。

錯在compiler/linker身上。你相信嗎?

我有些global static的資料,應該要對齊(align)偶數的記憶體位址的,但卻沒有,所以存取時就會發生bus error

我的天啊,segmentation fault倒是很常見,指標沒弄好就會存取到不該存取的記憶體,可是bus error,講正確一點是unaligned access,有學過沒看過,真是讓我學到一課啊。

後來跟幾個同事討論,雖然知道這是個compiler/linker的bug,但我們也不能去修改這些工具,所以解決方法就是改用別的方法,避開這個問題。我又想,怎麼只有我出現這個問題,把所有程式碼都掃一遍,卻這麼剛好,只有我用的寫法剛剛好compiler/linker會產出錯誤的程式碼,真是夠了。

1 comment:

  1. Anonymous19/7/10 14:49

    我猜或許有些巨集可以防止alignment的問題,宣告的時候加一加就會沒事…。就networking的data經驗來說是這樣的,不過不是windows上的。

    ReplyDelete