三、怎樣「除錯」 release 版的程式
遇到 debug 成功但 release 失敗,顯然是一件很沮喪的事,而且往往無從下手。如果你看了以上的分析,結合錯誤的具體表現,很快找出了錯誤,固然很好。但如果一時找不出,以下給出了一些在這種情況下的策略。
1. 前面已經提過,debug 和 release 只是一組編譯選項的差別,實際上並沒有什麼定義能區分二者。我們可以修改 release 版的編譯選項來縮小錯誤範圍。如上所述,可以把 release 的選項逐個改為與之相對的 debug 選項,如 /md 改為 /mdd、/o1 改為 /od,或執行時間優化改為程式大小優化。注意,一次只改乙個選項,看改哪個選項時錯誤消失,再對應該選項相關的錯誤,針對性地查詢。這些選項在 project/settings... 中都可以直接通過列表選取,通常不要手動修改。由於以上的分析已相當全面,這個方法是最有效的。
2. 在程式設計過程中就要時常注意測試 release 版本,以免最後**太多,時間又很緊。
3. 在 debug 版中使用 /w4 警告級別,這樣可以從編譯器獲得最大限度的錯誤資訊,比如 if( i =0 )就會引起 /w4 警告。不要忽略這些警告,通常這是你程式中的 bug 引起的。但有時 /w4 會帶來很多冗餘資訊,如 未使用的函式引數 警告,而很多訊息處理函式都會忽略某些引數。我們可以用
#progma warning(disable: 4702) //禁止
//...
#progma warning(default: 4702) //重新允許
來暫時禁止某個警告,或使用
#progma warning(push, 3) //設定警告級別為 /w3
//...
#progma warning(pop) //重設為 /w4
來暫時改變警告級別,有時你可以只在認為可疑的那一部分**使用 /w4。
4.你也可以像 debug 一樣除錯你的 release 版,只要加入除錯符號。在 project/settings... 中,選中 settings for "win32 release",選中 c/c++ 標籤,category 選 general,debug info 選 program database。再在 link 標籤 project options 最後加上 "/opt:ref" (引號不要輸)。這樣偵錯程式就能使用 pdb 檔案中的除錯符號。但除錯時你會發現斷點很難設定,變數也很難找到——這些都被優化過了。不過令人慶幸的是,call stack 視窗仍然工作正常,即使幀指標被優化,棧資訊(特別是返回位址)仍然能找到。這對定位錯誤很有幫助。
release版本和debug版本
程式一般分為debug 版本和release 版本,debug 版本用於內部除錯,release 版本發行給使用者使用 release和 debug 有什麼不同 release版稱為發行版,debug版稱為除錯版。debug中可以單步執行 跟蹤等功能,但生成的可執行檔案比較大,執行速度較慢。rele...
debug版本和release版本
執行 debug版本輸出結果 仔細觀察,可以發現release版本的結果中,a與c的值差為4,debug版本的結果中,a和c的結果直差為8.為什麼?四個位元組被優化掉了。32位系統 呼叫函式是通過棧來傳遞引數,我們列印的位址實際上是在棧裡面位置的位址 64位系統 函式傳參絕大多數不同通過棧來傳輸的,...
debug和release版本對比
debug和release,在我看來主要是針對其面向的目標不同的而進行區分的 debug通常稱為除錯版本,通過一系列編譯選項的配合,編譯的結果通常包含除錯資訊,而且不做任何優化,以為開發人員提供強大的應用程式除錯能力。release通常稱為發布版本,是為使用者使用的,一般客戶不允許在發布版本上進行除...