vc6 debug release 結果不一致問題

2021-04-14 02:46:22 字數 2597 閱讀 7231

網上找了些資料,但未能解決我的問題:

i.   記憶體分配問題 

1.   變數未初始化。 

為debug中會自動給變數初始化found=false,而在release版中 

則不會。所以盡可能的給變數、類或結構初始化。 

2.   資料溢位的問題 

如:char   buffer[10]; 

int   counter; 

lstrcpy(buffer,   "abcdefghik"); 

在debug版中buffer的null覆蓋了counter的高位,但是除非counter>16m,什麼問題也沒 

有。但是在release版中,counter可能被放在暫存器中,這樣null就覆蓋了buffer下面 

的空間,可能就是函式的返回位址,這將導致access   error。 

3.   debug版和release版的記憶體分配方式是不同的   。如果你在debug版中申請 

ele   為   6*sizeof(dword)=24bytes,實際上分配給你的是32bytes(debug版以32bytes 

為單位分配),   而在release版,分配給你的就是24bytes(release版以8bytes為單位 

),所以在debug版中如果你寫ele[6],可能不會有什麼問題,而在release版中,就有a 

ccess   violate。 

ii.   assert和verify 

1.   assert在release版本中是不會被編譯的。   

假如你在這些語句中加了程式中必須要有的代 

碼  比如 

assert(pnewobj   =   new   cmyclass); 

pnewobj->myfunction(); 

這種時候release版本中的pnewobj不會分配到空間 

所以執行到下乙個語句的時候程式會報該程式執行了非法操作的錯誤。這時可以用verify   

iii.   引數問題: 

自定義訊息的處理函式,必須定義如下: 

afx_msg   lresult   onmymessage(wparam,   lparam); 

返回值必須是hresult型,否則debug會過,而release出錯   

iv.   記憶體分配 

保證資料建立和清除的統一性:如果乙個dll提供乙個能夠建立資料的函式,那麼這個d 

ll同時應該提供乙個函式銷毀這些資料。資料的建立和清除應該在同乙個層次上。 

v.   dll的災難 

人們將不同版本dll混合造成的不一致性形象的稱為   「動態連線庫的地獄「(dll   hell)   

如果你的程式使用你自己的dll時請注意: 

1.   不能將debug和release版的dll混合在一起使用。debug都是debug版,releas 

e版都是release版。 

解決辦法是將debug和release的程式分別放在主程式的debug和release目錄下 

2.   千萬不要以為靜態連線庫會解決問題,那只會使情況更糟糕 

vi.   release板中的除錯   : 

1.   將assert()   改為   verify()   。找出定義在"#ifdef   _debug"中的**,如果 

在release版本中需要這些**請將他們移到定義外。查詢trace(...)中**,因為這些 

**在release中也不被編譯。   請認真檢查那些在release中需要的**是否並沒有被便 

宜。 

2.   變數的初始化所帶來的不同,在不同的系統,或是在debug/release版本間 

都存在這樣的差異,所以請對變數進行初始化。 

3.   是否在編譯時已經有了警告?請將警告級別設定為3或4,然後保證在編譯時沒 

有警告出現. 

vii.   將project   settings"   中   "c++/c   "   專案下優化選項改為disbale(debug)。編 

譯器的優化可能導致許多意想不到的錯誤,請參考 http://www.pgh.net/~newcomer/deb

ug_release.htm 

1.   此外對release版本的軟體也可以進行除錯,請做如下改動: 

在"project   settings"   中   "c++/c   "   專案下設定   "category"   為   "general"   並且將"d 

ebug   info"設定為   "program   database"。 

在"link"專案下選中"generate   debug   info"檢查框。 

"rebuild   all" 

如此做法會產生的一些限制: 

無法獲得在mfc   dll中的變數的值。 

必須對該軟體所使用的所有dll工程都進行改動。    

我查啊查啊查啊,查了好多天。後來換到另一台電腦上重新編譯:創天中文vc6,原來那台是英文版的。

但是竟然沒有問題了。

難道是創天vc和英文vc?還是環境?

不得其解......

vc6 控制項

詳見msdn 為控制項新增乙個控制項型變數然後訪問之 edit idc edit1 m edit1 void ctest1dlg onbutton1 也可以直接使用id訪問 cstring str int i getdlgitemtextw idc edit1,str afxmessagebox s...

VC6遠端除錯

vc開發環境之所以提供遠端除錯的能力,是因為有些情況下單機除錯會讓你崩潰掉。比如,除錯gui程式的wm paint訊息,因為要單步除錯,所以 偵錯程式會對介面的重繪產生 heisenberg不確定性原理 當然還有些別的情況也適用,比如程式在測試環境執行的好好的,但是在客戶那行為總 是異常,這時候如果...

VC6 VC2005 的命令列

vc6 選單 project setting custom biuld 我要將lib檔案拷貝到lib目錄中 在 commands 寫命令 copy inputdir inputname lib wkspdir lib inputname lib 在outputs中 wkspdir lib input...