很久很久以前,工作內容是在手機平台上寫程式,曾經出過一次包,當時六神無主,手足無措,因為執行到我的程式就當機,更慘的是一點概念都沒有,不知道哪裡錯了,一當機就驚醒我夢中人,嚇的我屁滾尿流失了魂,。
後來,光用看的看不出所以然,就把改過的跟原來正常的版本作比較,但也還是不知道錯在哪,於是出動硬體偵錯的工具,邊執行邊追,一行一行追,終於得知問題所在。
錯在compiler/linker身上。你相信嗎?
我有些global static的資料,應該要對齊(align)偶數的記憶體位址的,但卻沒有,所以存取時就會發生bus error。
我的天啊,segmentation fault倒是很常見,指標沒弄好就會存取到不該存取的記憶體,可是bus error,講正確一點是unaligned access,有學過沒看過,真是讓我學到一課啊。
後來跟幾個同事討論,雖然知道這是個compiler/linker的bug,但我們也不能去修改這些工具,所以解決方法就是改用別的方法,避開這個問題。我又想,怎麼只有我出現這個問題,把所有程式碼都掃一遍,卻這麼剛好,只有我用的寫法剛剛好compiler/linker會產出錯誤的程式碼,真是夠了。
2010/06/13
回憶起一次出包經驗
標籤: programming
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++不可錯過的著作喔。
標籤: programming
2010/06/09
智慧財產權的省思:Johanna Blakely: Lessons from fashion's free culture
忘記為什麼會看到這段放上YouTube的演講影片,也不知道演講者Johanna Blakely是誰,看到題目中有個fashion字眼,感覺應該跟我沒什麼關係,但還是看完整場演講,深刻地我心裡留下印象,所以推薦給大家。
底下是我把演講內容(不長,不到十六分鐘)大意摘要,不免會有斷章取義之疑,請大家一定要看原影片喔。P.S.現在YouTube已經可以聽聲轉字幕囉,真強。
主題是,時尚產業中的智慧財產權。在時尚產業,智慧財產權的保護機制很少,唯一有的大概是商標保護,沒有著作權、專利、版權等等。
有時候把商標組合進設計裡面,也是防盜拷的一個手段。
即使這樣,還是會有一堆的防冒品。
為什麼沒有適當的保護機制呢?因為將外觀設計納進版權保護的範圍太功利了。
太功利?如果不能擁有,誰還要創新呢?但正因為沒有保護,所以整個時尚產業非常開放,非常有創造力,非常前衛先進。
因為拷貝仿冒無罪,是可以的。因為可以無限制地互相參考、抄襲,整個產業進步地非常快。
設計師必須更加進步,想出更好的設計,想出更新的概念。
於是乎這些可賣錢的產品變成了藝術品。
可是如果沒有保護?那大家不就都去買便宜又差不多的產品?
Tom Ford,Gucci設計師說的好,會買仿冒品的就不會是我們的顧客。
這種環境,致使Charlie Parker必須發明出白人絕對無法發出的聲音與獨特的音樂。
這種環境,讓設計師想出各種無法仿冒的點子,因為你一拷貝,大家就知道你是仿冒者。
所以copy是件好事情啊。
有很多產業有保護機制,例如雕刻、攝影、電影、音樂。有很多產業沒有機制,例如食譜、一道菜外觀、汽車、家具、魔術技巧、髮型、開放式程式碼軟體、刺青圖案、煙火、遊戲規則、香水的味道等等。
你自己看看吧,沒有保護的產業賺的更多喔。
是誰擁有"外觀"?哪些是私有的,哪些是趨勢被全世界所共有?這太難回答了。以前有實體vs概念可區分,但現在的數位科技改變了一切,書跟音樂都變成檔案了!
在數位世界裡,哪一種"擁有"的概念可以讓我們達到最棒最好的創新?
我的建議是,時尚業的文化可供借鏡。還想知道更多的,請到http://www.readytoshare.org/
聽完演講:
讓我想起,周杰倫的音樂,那種調調跟那種含糊不清,別人仿冒一聽就知道。
讓我想起,很久以前,蘋果控告微軟的視窗系統抄襲他們麥金塔的介面(look and feel)。
讓我重新思考智慧財產權、著作權、專利等等。
你呢?