Debug模式和Release模式需要注意的問題


在逛論壇時看到下面一段很值得借鑒的經驗(感謝bluebohe薄荷):

1.   變量。  
大家都知道,debug跟release在初始化變量時所做的操作是不同的,debug是將每個字節位都賦成0xcc(注1),而release的賦值近 似於隨機(我想是直接從內存中分配的,沒有初始化過)。這樣就明確了,如果你的程序中的某個變量沒被初始化就被引用,就很有可能出現異常:用作控制變量將 導致流程導向不一致;用作數組下標將會使程序崩潰;更加可能是造成其他變量的不准確而引起其他的錯誤。所以在聲明變量后馬上對其初始化一個默認的值是最簡 單有效的辦法,否則項目大了你找都沒地方找。代碼存在錯誤在debug方式下可能會忽略而不被察覺到,如debug方式下數組越界也大多不會出錯,在 release中就暴露出來了,這個找起來就比較難了:(   還是自己多加注意吧。

2.   自定義消息的消息參數。  
MFC為我們提供了很好的消息機制,更增加了自定義消息,好處我就不用多說了。這也存在debug跟release的問題嗎?答案是肯定的。在自定義消息的函數體聲明時,時常會看到這樣的寫法:  
afx_msg   LRESULT   OnMessageOwn();   Debug情況下一般不會有任何問題,而當你在Release下且多線程或進程間使用了消息傳遞時就會導致無效句柄之類的錯誤。導致這個錯誤直接原因是消 息體的參數沒有添加,即應該寫成:afx_msg   LRESULT   OnMessageOwn(WPARAM   wparam,   LPARAM  
lparam);   (注2)  

3.   release模式下不出錯,但debug模式下報錯。  
這種情況下大多也是因為代碼書寫不正確引起的,查看MFC的源碼,可以發現好多ASSERT的語句(斷言),這個宏只是在debug模式下才有效,那么就 清楚了,release版不報錯是忽略了錯誤而不是沒有錯誤,這可能存在很大的隱患,因為是Debug模式下,比較方便調試,好好的檢查自己的代碼,再此 就不多說了。  

4.   ASSERT,   VERIFY,   TRACE..........調試宏  
這種情況很容易解釋。舉個例子:請在VC下輸入ASSERT然后選中按F12跳到宏定義的地方,這里你就能夠發現Debug中ASSERT要執行 AfxAssertFailedLine,而Release下的宏定義卻為 "#define   ASSERT(f)   ((void)0) "。所以注意在這些調試宏的語句不要用程序相關變量如i++寫操作的語句。VERIFY是個例外, "#define   VERIFY(f)   ((void)(f)) ",即執行,這里的作用就不多追究了,有興趣可自己研究:)。  


總結:  
Debug與Release不同的問題在剛開始編寫代碼時會經常發生,99%是因為你的代碼書寫錯誤而導致的,所以不要動不動就說系統問題或編譯器問題, 努力找找自己的原因才是根本。我從前就常常遇到這情況,經歷過一次次的教訓后我就開始注意了,現在我所寫過的代碼我已經好久沒遇到這種問題了。下面是幾個 避免的方面,即使沒有這種問題也應注意一下:  

1.   注意變量的初始化,尤其是指針變量,數組變量的初始化(很大的情況下另作考慮了)。  
2.   自定義消息及其他聲明的標准寫法  
3.   使用調試宏時使用后最好注釋掉  
4.   盡量使用try   -   catch(...)  
5.   盡量使用模塊,不但表達清楚而且方便調試。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM