因為接手兩支上萬行的程式互相丟資料,其中又有定期廣播的動作,所以每次debug都要重開兩支程式,如果一行一行trace,還會被那些解讀封包的functions煩死,根本跑不到想要偵測的部分。
如果能知道出錯的檔案行數,就很容易解決,多半是變數沒有處理好,程式邏輯的錯誤我還沒有遇過。
可是今天發生的錯誤都是直接跑出組語和記憶體位址,程式畫面爛掉不給看,所以印出來的訊息都看不見了,找不到出錯的關鍵點,花了一整天在縮小錯誤發生的可能範圍。
還好最後讓我找到問題了,問題出在我另外寫的echo server,因為是拿以前寫的shell server改過的,裡面會去把’\r’和’\n’切掉換成’\0′,資料出去的和進來的長度不一樣,但是header顯示的資料長度還是原來的,所以就導致之後的讀取動作會讀到不該讀的地方。
搞了一整天,尤其明天就要demo的壓力,讓我差點就要砸電腦了。不過,總算是自己想到問題發生的地方,算是不幸中的大幸吧,希望我接下來的工作,不需要很順暢,但總能在時限之前完成,這樣我就心滿意足了。
今天整天發瘋,坐在我旁邊的wenjen都看在眼裡。解決bug明天可以順利demo很開心,就告訴wenjen我是怎樣找到bug,聽完bug的原因之後,她說了一句讓我很囧的話:「接到手上的程式本來是可以跑得很順的,所以之後會出錯一定都是自己寫錯。」
不過話又說回來,昨天為了一個很誇張的bug也是差點要砸電腦,只因為一個 bool 變數,指令明明是寫 inUse = false, 可是 inUse卻變成 true,害我也是花了好久的時間在程式碼一行一行trace,等到發現這個狀況的時候真是哭笑不得,學長把指令換成 inUse = true,inUse還是變成true,用false也是true,我跟學長都覺得莫名其妙,最後就寫inUse = 0 將這個bug宣告法定死亡了。
只是,我還有很多 bool 變數,我彷彿看見明天 demo 完之後的第二階段 debug 無間地獄正在向我招手哪…

「接到手上的程式本來是可以跑得很順的,所以之後會出錯一定都是自己寫錯。」
這也不一定,也有可能是之前埋下的地雷,被後來的程式給觸發了。
好比說,我碰過這樣子的一個程式:已經先呼叫過 FooInit() 過了,程式還是爛掉,追了好幾天,才發現除了 FooInit() 之外,還要幫他 (另外一個 library) 的一個全域 pointer 變數,配置夠大的寄液體給他指。
碰到這種地雷,也只能暗呼倒楣。
Comment by jeffhung — May 12, 2006 @ 7:21 am
可以先產生每個要 debug 的程式的 symbol, 然後使用這些 symbol
這樣就不會出現組合語言的畫面
Comment by Auron — May 12, 2006 @ 8:07 am
afoofa 您好,我目前是電機系大三的學生,由於專題的關西,我要做802.16e PHY層的模擬,所以有些問題想要請問您,不知道是否可以給我您的e-mail呢,或是在留言中問您,可以嗎,知道您現在再寫論文階段,希望不會打擾,謝謝
Comment by wuwuwu — June 2, 2006 @ 1:00 am
嗯..wuwuwu您好 :)
其實我對 PHY 的部分並不是很瞭解,因為我只有看過 MAC layer的部分,雖然我知道802.16e和802.16d在PHY上亦有些不同,然而詳細的規格和技術我並不清楚,可能幫不上忙。我想這就是資工與電機的差異吧。(苦笑)
但是如果您能在這裡留言,我可以幫您問問看可能會知道這部分的人…@@
Comment by afoofa — June 5, 2006 @ 10:58 am