2008年5月13日 星期二

利用ASSERT來檢查問題

前一陣子發生了一個問題, 我的程式平常很正常, 但是在某些時候程式會彈出一個視窗, 內容為 : 參數錯誤。. 我完全搞不清楚發生了什麼事, 而且即使發生這樣的問題程式依舊可以繼續執行, 但是這還是程式的bug, 所以一直在想辦法解決.

結果後來才發現到, 原來是我的程式是用VS 2005做為開發環境, 而我在跑的程式是用Release模式去compile的. 在release模式下ASSERT這個函式會被忽略, 恰巧我呼叫CString裡面的Tokenize這個function它會去檢查傳入的參數是否<0, 以確保分解字串不會產生錯誤. 在這樣的情況下ASSERT沒有被執行, 而在ASSERT之後就會產生參數錯誤這樣的視窗了.
所以ASSERT的功用在於檢查某個運算式, 如果為真則不會做什麼, 如果為判斷式為False會跳出ASSERT的訊息, 並且告訴你在哪個檔案的哪一行出現這個錯誤. 總體來說, 這個故事告訴我們 :

  1. 除非對自己的程式很有信心, 還是用debug模式去compile比較安全
  2. 雖然很多問題都可以靠google解決, 但是常常碰到的就是那種無法用google解決的bug, 所以做每個動作都要檢查清楚, 還有紀錄log以供參考
  3. windows上的程式可以用drwtsn32.exe來產生core file, 並且可以用VS 2005來還原案發現場

沒有留言: