日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【转】程序debug正常release错误

發布時間:2025/3/12 编程问答 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【转】程序debug正常release错误 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

原文:http://hi.baidu.com/leggle/blog/item/ec0c2e5400c3ed5dd10906a7.html

呵呵,Iris來了!由于最近所做項目接近尾聲,想在release下運行卻發現遇此問題,遂在網上搜尋,摘錄如下:

VC編寫程序在debug下正常,在release下錯誤
可能存在的原因:
1、內存分配問題
(1)變量初始化
Release對程序的要求較Debug嚴格,應該對所有的變量(特別是指針和BOOL型)都先初始化再使用。
(2)數據溢出的問題
如:程序段 char buffer[4]; int num; strcpy(buffer,”abcd”);
在debug 版中buffer的NULL覆蓋了num的高位,但是除非num >16M,什么問題也沒有。但是在release版中, num可能被放在寄存器中,這樣NULL就覆蓋了buffer下面的空間,可能就是函數的返回地址,這將導致ACCESS ERROR。
(3)內存分配方式不同
如果你在DEBUG版中申請 ele 為 6*sizeof(DWORD)=24bytes,實際上分配給你的是32bytes(debug版以32bytes為單位分配),而在release版,分配給你的就是24bytes(release版以8bytes為單位),所以在debug版中如果你寫ele[6],可能不會有什么問題,而在release版中,就有ACCESS VIOLATE
2、用戶自定義消息應該按照定義的方式去使用
對于用戶自定義消息: #define WM_USERMESSAGENAME WM_USER+1
ON_MESSAGE定義: ON_MESSAGE(WM_USERMESSAGENAME, OnUserMessageName), 該宏需要兩個參數,如果消息響應函數并沒有參數,編譯器在壓棧出棧時就會出錯,而DEBUG版運行時編譯器會自動加一些測試代碼,所以不會造成堆棧的破壞。
解決辦法:1)把ON_MESSAGE 替換成ON_MESSAGE_VOID (頭文件<AFXPRIV.H>),該宏不需要參數
2)修改消息響應函數: afx_msg void OnUserMessageName(WPARAM wparam, LPARAM lparam) //一定要加參數,不管用不用得到
3、ASSERT和VERIFY
ASSERT在release版本中不會被編譯,若在ASSERT中有空間分配等,就會帶來錯誤。改為VERIFY即可。
4、內存分配
保證數據創建和清除的統一性:如果一個DLL提供一個能夠創建數據的函數,那么這個DLL同時應該提供一個函數銷毀這些數據。數據的創建和清除應該在同一個層次上。
5、DLL的災難
如果你的程序使用你自己的DLL時請注意:
1)不能將debug和release版的DLL混合在一起使用。debug都是debug版,release版都是release版。
2)千萬不要以為靜態連接庫會解決問題,那只會使情況更糟糕。
6、將Project Settings中 C++/C 項目下優化選項改為 Disable(Debug)
編譯器的優化可能導致許多意想不到的錯誤。
參考:http://www.cygnus-software.com/papers/release_debugging.html
另附zz:
(1) 幀指針(Frame Pointer)省略(簡稱 FPO ):在函數調用過程中,所有調用信息(返回地址、參數)以及自動變量都是放在棧中的。若函數的聲明與實現不同(參數、返回值、調用方式),就會產生錯誤 ————但 Debug 方式下,棧的訪問通過 EBP 寄存器保存的地址實現,如果沒有發生數組越界之類的錯誤(或是越界“不多”),函數通常能正常執行;Release 方式下,優化會省略 EBP 棧基址指針,這樣通過一個全局指針訪問棧就會造成返回地址錯誤是程序崩潰。C++ 的強類型特性能檢查出大多數這樣的錯誤,但如果用了強制類型轉換,就不行了。你可以在 Release 版本中強制加入 /Oy- 編譯選項來關掉幀指針省略,以確定是否此類錯誤。
(2) volatile 型變量:volatile 告訴編譯器該變量可能被程序之外的未知方式修改(如系統、其他進程和線程)。優化程序為了使程序性能提高,常把一些變量放在寄存器中(類似于 register 關鍵字),而其他進程只能對該變量所在的內存進行修改,而寄存器中的值沒變。如果你的程序是多線程的,或者你發現某個變量的值與預期的不符而你確信已正確 的設置了,則很可能遇到這樣的問題。這種錯誤有時會表現為程序在最快優化出錯而最小優化正常。把你認為可疑的變量加上 volatile 試試。

總結

以上是生活随笔為你收集整理的【转】程序debug正常release错误的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。