2009年8月22日 星期六

Qt Debug 方法

最近為了好幾件 project 忙的焦頭爛額,其中一個案子,是負責GUI及整合各組件,其中GUI的部份,是以Qt實作。

當然,這麼重的工作量不會是一個人完成,不過也沒好到哪裡去,兩個人。

和另一個同事co-work了一個星期。project leader一直希望我們分工,我則是以兩個人都是Qt新手,一起co-work,彼此發現盲點,會比較快上手的理由,兩個人坐在同一張桌子,隨時coding,隨時討論,連續工作了一個禮拜。

這個星期工作的進度還不少,整個UI的架構已經有個雛型出來了,而且也漸漸上手了。不過星期五又被project leader壓schedule,本來是拉到十月中的schedule,一句如果兩個人分工,時間可以縮短一半的說法,聽到我下巴差點掉下來。

這星期的工作,發現了一件事:有些地方,用了很腦殘的寫法,另一個同事偶爾會發現,五分鐘指出來,當場修正;如果一個人枯坐在那邊找,可能找了兩個小時也找不出來。五分鐘和兩個小時,縮短一半的時間,嗯……

怎麼會扯這麼多,本來是要寫Qt簡易的debug方法而已 = =

星期五早上,一到辦公室,很快樂地把前一天晚上的程式碼 copy 到另一個目錄,很快樂地執行,死掉!跑回原來的目錄,正常執行。檢查程式內的圖檔是否有使用絕對路徑,檢查了dll檔有沒有在正確的目錄,檢查了各個object有沒有去指到Null pointer,檢查了所有想得到的點,還是一樣。

後來請jarsing來看,make release的可以執行,make debug的不能執行。好吧,將就一點,以後就用 make release。

到了下午,連make release都不行了。問題大了,也不知道怎麼去debug。

在網路上搜尋了一下子,發現有個很簡單的作法:原來Qt也可以用 gdb 去debug,而且安裝完成後,裡面就有gdb了。

進gdb,run,backtrace,找到了錯誤的點,很腦殘,一個為了測試用的button,設定為按↑鍵後,會跳到另一個object,可是那個object還沒實體化。就這樣,看運氣,運氣不好踩到錯誤的記憶體空間,就當了。

可是,在windows下怎麼做傳統C的printf動作?還是沒解。

假日無聊,想起jarsing有寫過一系列Qt的文章,跑上去看,果然有寫,使用qDebug(),然後在pro裡面加上CONFIG = console就行了。

後來,洗澡的時候,想到這件事,一直覺得應該有個方法可以在compile時決定qDebug()要不要把訊息印出來,這樣,在release的時候,就可以把debug message關掉。

晚上找了一下qt的官方文件,在 http://qt.nokia.com/doc/4.5/debug.html 有說明 debug 的方法,其中提到,只要define QT_NO_DEBUG_OUTPUT 這個 symbol,就可以不讓qDebug()的訊息印出來;另外,QT_NO_WARNING_OUTPUT則可以不讓qWarning()印出來。

報告完畢!玩了一個星期,發現,GUI還真的有點意思。

 

最後,誰是 jarsing?他是我的一個好朋友,在 google 上找找這個人就知道他是何方神聖了。