• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            隨筆 - 505  文章 - 1034  trackbacks - 0
            <2007年12月>
            2526272829301
            2345678
            9101112131415
            16171819202122
            23242526272829
            303112345


            子曾經(jīng)曰過(guò):編程無(wú)他,唯手熟爾!

            常用鏈接

            留言簿(94)

            隨筆分類(649)

            隨筆檔案(505)

            相冊(cè)

            BCB

            Crytek

            • crymod
            • Crytek's Offical Modding Portal

            Game Industry

            OGRE

            other

            Programmers

            Qt

            WOW Stuff

            搜索

            •  

            積分與排名

            • 積分 - 917344
            • 排名 - 14

            最新隨筆

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            未初始化的bool成員變量在Debug下默認(rèn)值為false,Test下默認(rèn)true。一個(gè)bug查了一晚上,原因就是這個(gè).

            人物創(chuàng)建的場(chǎng)景在Debug下正常,在Test和Release下不正常,就是鏡頭不對(duì)。然后就盯著這個(gè)載入場(chǎng)景的配置文件的代碼看,ini不用了,換成xml看看,還是有問(wèn)題!直接在代碼里賦值,不用配置文件還是有問(wèn)題!(之所以盯著這里看,是因?yàn)樵赥est下調(diào)試時(shí)發(fā)現(xiàn)讀配置文件出來(lái)的值不對(duì),但是用log打印出來(lái)卻是對(duì)的!)
                    于是否定了配置文件的問(wèn)題,然后一想,既然是鏡頭的問(wèn)題,就在setCamera(...)函數(shù)上打個(gè)斷點(diǎn)不就行了,看哪里不該調(diào)用的時(shí)候調(diào)用了這個(gè)函數(shù),Bingo!問(wèn)題就找到了!丫的一未初始化的bool成員變量在Test下默認(rèn)是true,我靠!
                     出來(lái)混,遲早要還的!寫(xiě)了成員變量,立馬初始化才是正道,千萬(wàn)別偷懶或者忘了初始化!

            另可參考:
            [轉(zhuǎn)]DEBUG和RELEASE版本差異及調(diào)試相關(guān)問(wèn)題

            Debug和Release有什么區(qū)別?怎么把Debug轉(zhuǎn)成Release ?
            1。Debug和Release有什么區(qū)別,為什么要使用Release版本!  
            2。怎么把Debug轉(zhuǎn)成Release  

            轉(zhuǎn)載:  

            Debug版本包括調(diào)試信息,所以要比Release版本大很多(可能大數(shù)百K至數(shù)M)。至于是否需要DLL支持,主要看你采用的編譯選項(xiàng)。如果是基于ATL的,則Debug和Release版本對(duì)DLL的要求差不多。如果采用的編譯選項(xiàng)為使用MFC動(dòng)態(tài)庫(kù),則需要MFC42D.DLL等庫(kù)支持,而Release版本需要MFC42.DLL支持。Release   Build不對(duì)源代碼進(jìn)行調(diào)試,不考慮MFC的診斷宏,使用的是MFC   Release庫(kù),編譯十對(duì)應(yīng)用程序的速度進(jìn)行優(yōu)化,而Debug   Build則正好相反,它允許對(duì)源代碼進(jìn)行調(diào)試,可以定義和使用MFC的診斷宏,采用MFC   Debug庫(kù),對(duì)速度沒(méi)有優(yōu)化。    


            一、Debug   和   Release   編譯方式的本質(zhì)區(qū)別  

            Debug   通常稱為調(diào)試版本,它包含調(diào)試信息,并且不作任何優(yōu)化,便于程序員調(diào)試程序。Release   稱為發(fā)布版本,它往往是進(jìn)行了各種優(yōu)化,使得程序在代碼大小和運(yùn)行速度上都是最優(yōu)的,以便用戶很好地使用。  
            Debug   和   Release   的真正秘密,在于一組編譯選項(xiàng)。下面列出了分別針對(duì)二者的選項(xiàng)(當(dāng)然除此之外還有其他一些,如/Fd   /Fo,但區(qū)別并不重要,通常他們也不會(huì)引起   Release   版錯(cuò)誤,在此不討論)  

            Debug   版本:  
            /MDd   /MLd   或   /MTd   使用   Debug   runtime   library(調(diào)試版本的運(yùn)行時(shí)刻函數(shù)庫(kù))  
            /Od   關(guān)閉優(yōu)化開(kāi)關(guān)  
            /D   "_DEBUG"   相當(dāng)于   #define   _DEBUG,打開(kāi)編譯調(diào)試代碼開(kāi)關(guān)(主要針對(duì)  
            assert函數(shù))  
            /ZI   創(chuàng)建   Edit   and   continue(編輯繼續(xù))數(shù)據(jù)庫(kù),這樣在調(diào)試過(guò)  
            程中如果修改了源代碼不需重新編譯  
            /GZ   可以幫助捕獲內(nèi)存錯(cuò)誤  
            /Gm   打開(kāi)最小化重鏈接開(kāi)關(guān),減少鏈接時(shí)間  

            Release   版本:    
            /MD   /ML   或   /MT   使用發(fā)布版本的運(yùn)行時(shí)刻函數(shù)庫(kù)  
            /O1   或   /O2   優(yōu)化開(kāi)關(guān),使程序最小或最快  
            /D   "NDEBUG"   關(guān)閉條件編譯調(diào)試代碼開(kāi)關(guān)(即不編譯assert函數(shù))  
            /GF   合并重復(fù)的字符串,并將字符串常量放到只讀內(nèi)存,防止  
            被修改  

            實(shí)際上,Debug   和   Release   并沒(méi)有本質(zhì)的界限,他們只是一組編譯選項(xiàng)的集合,編譯器只是按照預(yù)定的選項(xiàng)行動(dòng)。事實(shí)上,我們甚至可以修改這些選項(xiàng),從而得到優(yōu)化過(guò)的調(diào)試版本或是帶跟蹤語(yǔ)句的發(fā)布版本。  

            二、哪些情況下   Release   版會(huì)出錯(cuò)  

            有了上面的介紹,我們?cè)賮?lái)逐個(gè)對(duì)照這些選項(xiàng)看看   Release   版錯(cuò)誤是怎樣產(chǎn)生的  

            1.   Runtime   Library:鏈接哪種運(yùn)行時(shí)刻函數(shù)庫(kù)通常只對(duì)程序的性能產(chǎn)生影響。調(diào)試版本的   Runtime   Library   包含了調(diào)試信息,并采用了一些保護(hù)機(jī)制以幫助發(fā)現(xiàn)錯(cuò)誤,因此性能不如發(fā)布版本。編譯器提供的   Runtime   Library   通常很穩(wěn)定,不會(huì)造成   Release   版錯(cuò)誤;倒是由于   Debug   的   Runtime   Library   加強(qiáng)了對(duì)錯(cuò)誤的檢測(cè),如堆內(nèi)存分配,有時(shí)會(huì)出現(xiàn)   Debug   有錯(cuò)但   Release   正常的現(xiàn)象。應(yīng)當(dāng)指出的是,如果   Debug   有錯(cuò),即使   Release   正常,程序肯定是有   Bug   的,只不過(guò)可能是   Release   版的某次運(yùn)行沒(méi)有表現(xiàn)出來(lái)而已。  

            2.   優(yōu)化:這是造成錯(cuò)誤的主要原因,因?yàn)殛P(guān)閉優(yōu)化時(shí)源程序基本上是直接翻譯的,而打開(kāi)優(yōu)化后編譯器會(huì)作出一系列假設(shè)。這類錯(cuò)誤主要有以下幾種:  

            (1)   幀指針(Frame   Pointer)省略(簡(jiǎn)稱   FPO   ):在函數(shù)調(diào)用過(guò)程中,所有調(diào)用信息(返回地址、參數(shù))以及自動(dòng)變量都是放在棧中的。若函數(shù)的聲明與實(shí)現(xiàn)不同(參數(shù)、返回值、調(diào)用方式),就會(huì)產(chǎn)生錯(cuò)誤————但   Debug   方式下,棧的訪問(wèn)通過(guò)   EBP   寄存器保存的地址實(shí)現(xiàn),如果沒(méi)有發(fā)生數(shù)組越界之類的錯(cuò)誤(或是越界“不多”),函數(shù)通常能正常執(zhí)行;Release   方式下,優(yōu)化會(huì)省略   EBP   棧基址指針,這樣通過(guò)一個(gè)全局指針訪問(wèn)棧就會(huì)造成返回地址錯(cuò)誤是程序崩潰。C++   的強(qiáng)類型特性能檢查出大多數(shù)這樣的錯(cuò)誤,但如果用了強(qiáng)制類型轉(zhuǎn)換,就不行了。你可以在   Release   版本中強(qiáng)制加入   /Oy-   編譯選項(xiàng)來(lái)關(guān)掉幀指針省略,以確定是否此類錯(cuò)誤。此類錯(cuò)誤通常有:  

            ●   MFC   消息響應(yīng)函數(shù)書(shū)寫(xiě)錯(cuò)誤。正確的應(yīng)為  
            afx_msg   LRESULT   OnMessageOwn(WPARAM   wparam,   LPARAM   lparam);  
            ON_MESSAGE   宏包含強(qiáng)制類型轉(zhuǎn)換。防止這種錯(cuò)誤的方法之一是重定義   ON_MESSAGE   宏,把下列代碼加到   stdafx.h   中(在#include   "afxwin.h"之后),函數(shù)原形錯(cuò)誤時(shí)編譯會(huì)報(bào)錯(cuò)  
            #undef   ON_MESSAGE  
            #define   ON_MESSAGE(message,   memberFxn)   \  
            {   message,   0,   0,   0,   AfxSig_lwl,   \  
            (AFX_PMSG)(AFX_PMSGW)(static_cast<   LRESULT   (AFX_MSG_CALL   \  
            CWnd::*)(WPARAM,   LPARAM)   >   (&memberFxn)   },  

            (2)   volatile   型變量:volatile   告訴編譯器該變量可能被程序之外的未知方式修改(如系統(tǒng)、其他進(jìn)程和線程)。優(yōu)化程序?yàn)榱耸钩绦蛐阅芴岣撸0岩恍┳兞糠旁诩拇嫫髦校愃朴?nbsp;  register   關(guān)鍵字),而其他進(jìn)程只能對(duì)該變量所在的內(nèi)存進(jìn)行修改,而寄存器中的值沒(méi)變。如果你的程序是多線程的,或者你發(fā)現(xiàn)某個(gè)變量的值與預(yù)期的不符而你確信已正確的設(shè)置了,則很可能遇到這樣的問(wèn)題。這種錯(cuò)誤有時(shí)會(huì)表現(xiàn)為程序在最快優(yōu)化出錯(cuò)而最小優(yōu)化正常。把你認(rèn)為可疑的變量加上   volatile   試試。  

            (3)   變量?jī)?yōu)化:優(yōu)化程序會(huì)根據(jù)變量的使用情況優(yōu)化變量。例如,函數(shù)中有一個(gè)未被使用的變量,在   Debug   版中它有可能掩蓋一個(gè)數(shù)組越界,而在   Release   版中,這個(gè)變量很可能被優(yōu)化調(diào),此時(shí)數(shù)組越界會(huì)破壞棧中有用的數(shù)據(jù)。當(dāng)然,實(shí)際的情況會(huì)比這復(fù)雜得多。與此有關(guān)的錯(cuò)誤有:  
            ●   非法訪問(wèn),包括數(shù)組越界、指針錯(cuò)誤等。例如  
            void   fn(void)  
            {  
            int   i;  
            i   =   1;  
            int   a[4];  
            {  
            int   j;  
            j   =   1;  
            }  
            a[-1]   =   1;//當(dāng)然錯(cuò)誤不會(huì)這么明顯,例如下標(biāo)是變量  
            a[4]   =   1;  
            }  
            j   雖然在數(shù)組越界時(shí)已出了作用域,但其空間并未收回,因而   i   和   j   就會(huì)掩蓋越界。而   Release   版由于   i、j   并未其很大作用可能會(huì)被優(yōu)化掉,從而使棧被破壞。  

            3.   _DEBUG   與   NDEBUG   :當(dāng)定義了   _DEBUG   時(shí),assert()   函數(shù)會(huì)被編譯,而   NDEBUG   時(shí)不被編譯。除此之外,VC++中還有一系列斷言宏。這包括:  

            ANSI   C   斷言   void   assert(int   expression   );  
            C   Runtime   Lib   斷言   _ASSERT(   booleanExpression   );  
            _ASSERTE(   booleanExpression   );  
            MFC   斷言   ASSERT(   booleanExpression   );  
            VERIFY(   booleanExpression   );  
            ASSERT_VALID(   pObject   );  
            ASSERT_KINDOF(   classname,   pobject   );  
            ATL   斷言   ATLASSERT(   booleanExpression   );  
            此外,TRACE()   宏的編譯也受   _DEBUG   控制。  

            所有這些斷言都只在   Debug版中才被編譯,而在   Release   版中被忽略。唯一的例外是   VERIFY()   。事實(shí)上,這些宏都是調(diào)用了   assert()   函數(shù),只不過(guò)附加了一些與庫(kù)有關(guān)的調(diào)試代碼。如果你在這些宏中加入了任何程序代碼,而不只是布爾表達(dá)式(例如賦值、能改變變量值的函數(shù)調(diào)用   等),那么   Release   版都不會(huì)執(zhí)行這些操作,從而造成錯(cuò)誤。初學(xué)者很容易犯這類錯(cuò)誤,查找的方法也很簡(jiǎn)單,因?yàn)檫@些宏都已在上面列出,只要利用   VC++   的   Find   in   Files   功能在工程所有文件中找到用這些宏的地方再一一檢查即可。另外,有些高手可能還會(huì)加入   #ifdef   _DEBUG   之類的條件編譯,也要注意一下。  
            順便值得一提的是   VERIFY()   宏,這個(gè)宏允許你將程序代碼放在布爾表達(dá)式里。這個(gè)宏通常用來(lái)檢查   Windows   API   的返回值。有些人可能為這個(gè)原因而濫用   VERIFY()   ,事實(shí)上這是危險(xiǎn)的,因?yàn)?nbsp;  VERIFY()   違反了斷言的思想,不能使程序代碼和調(diào)試代碼完全分離,最終可能會(huì)帶來(lái)很多麻煩。因此,專家們建議盡量少用這個(gè)宏。  

            4.   /GZ   選項(xiàng):這個(gè)選項(xiàng)會(huì)做以下這些事  

            (1)   初始化內(nèi)存和變量。包括用   0xCC   初始化所有自動(dòng)變量,0xCD   (   Cleared   Data   )   初始化堆中分配的內(nèi)存(即動(dòng)態(tài)分配的內(nèi)存,例如   new   ),0xDD   (   Dead   Data   )   填充已被釋放的堆內(nèi)存(例如   delete   ),0xFD(   deFencde   Data   )   初始化受保護(hù)的內(nèi)存(debug   版在動(dòng)態(tài)分配內(nèi)存的前后加入保護(hù)內(nèi)存以防止越界訪問(wèn)),其中括號(hào)中的詞是微軟建議的助記詞。這樣做的好處是這些值都很大,作為指針是不可能的(而且   32   位系統(tǒng)中指針很少是奇數(shù)值,在有些系統(tǒng)中奇數(shù)的指針會(huì)產(chǎn)生運(yùn)行時(shí)錯(cuò)誤),作為數(shù)值也很少遇到,而且這些值也很容易辨認(rèn),因此這很有利于在   Debug   版中發(fā)現(xiàn)   Release   版才會(huì)遇到的錯(cuò)誤。要特別注意的是,很多人認(rèn)為編譯器會(huì)用   0   來(lái)初始化變量,這是錯(cuò)誤的(而且這樣很不利于查找錯(cuò)誤)。  
            (2)   通過(guò)函數(shù)指針調(diào)用函數(shù)時(shí),會(huì)通過(guò)檢查棧指針驗(yàn)證函數(shù)調(diào)用的匹配性。(防止原形不匹配)  
            (3)   函數(shù)返回前檢查棧指針,確認(rèn)未被修改。(防止越界訪問(wèn)和原形不匹配,與第二項(xiàng)合在一起可大致模擬幀指針省略   FPO   )  

            通常   /GZ   選項(xiàng)會(huì)造成   Debug   版出錯(cuò)而   Release   版正常的現(xiàn)象,因?yàn)?nbsp;  Release   版中未初始化的變量是隨機(jī)的,這有可能使指針指向一個(gè)有效地址而掩蓋了非法訪問(wèn)。  

            除此之外,/Gm   /GF   等選項(xiàng)造成錯(cuò)誤的情況比較少,而且他們的效果顯而易見(jiàn),比較容易發(fā)現(xiàn)。  
            --------------------------------------------------------------  
            Release是發(fā)行版本,比Debug版本有一些優(yōu)化,文件比Debug文件小  
            Debug是調(diào)試版本,包括的程序信息更多  
            Release方法:  
            build->batch   build->build就OK.  

            -----------------------------------------------------  

            一、"Debug是調(diào)試版本,包括的程序信息更多"  

            補(bǔ)充:只有DEBUG版的程序才能設(shè)置斷點(diǎn)、單步執(zhí)行、使用TRACE/ASSERT等調(diào)試輸出語(yǔ)句。REALEASE不包含任何調(diào)試信息,所以體積小、運(yùn)行速度快。  

            二、一般發(fā)布release的方法除了hzh_shat(水)   所說(shuō)的之外,還可以project->Set   Active   Config,選中release版本。此后,按F5或F7編譯所得的結(jié)果就是release版本。


            Trackback: http://tb.donews.net/TrackBack.aspx?PostId=131016

            ----------------------------------------------------------------------------------------
            -------------------------------------------------------------------------------------------
            VC下關(guān)于debug和release的不同的討論
            在使用VC開(kāi)發(fā)軟件的過(guò)程中,正當(dāng)要享受那種興奮的時(shí)候突然發(fā)現(xiàn):release與debug運(yùn)行結(jié)果不一致,甚至出錯(cuò),而release又不方便調(diào)試,真的是當(dāng)頭一棒啊,可是疼歸疼,問(wèn)題總要解決,下面將講述一下我的幾點(diǎn)經(jīng)驗(yàn),看看是不是其中之一:

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

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

            3. release模式下不出錯(cuò),但debug模式下報(bào)錯(cuò)。
            這種情況下大多也是因?yàn)榇a書(shū)寫(xiě)不正確引起的,查看MFC的源碼,可以發(fā)現(xiàn)好多ASSERT的語(yǔ)句(斷言),這個(gè)宏只是在debug模式下才有效,那么就清楚了,release版不報(bào)錯(cuò)是忽略了錯(cuò)誤而不是沒(méi)有錯(cuò)誤,這可能存在很大的隱患,因?yàn)槭荄ebug模式下,比較方便調(diào)試,好好的檢查自己的代碼,再此就不多說(shuō)了。

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

            總結(jié):
            Debug與Release不同的問(wèn)題在剛開(kāi)始編寫(xiě)代碼時(shí)會(huì)經(jīng)常發(fā)生,99%是因?yàn)槟愕拇a書(shū)寫(xiě)錯(cuò)誤而導(dǎo)致的,所以不要?jiǎng)硬粍?dòng)就說(shuō)系統(tǒng)問(wèn)題或編譯器問(wèn)題,努力找找自己的原因才是根本。我從前就常常遇到這情況,經(jīng)歷過(guò)一次次的教訓(xùn)后我就開(kāi)始注意了,現(xiàn)在我所寫(xiě)過(guò)的代碼我已經(jīng)好久沒(méi)遇到這種問(wèn)題了。下面是幾個(gè)避免的方面,即使沒(méi)有這種問(wèn)題也應(yīng)注意一下:

            1. 注意變量的初始化,尤其是指針變量,數(shù)組變量的初始化(很大的情況下另作考慮了)。
            2. 自定義消息及其他聲明的標(biāo)準(zhǔn)寫(xiě)法
            3. 使用調(diào)試宏時(shí)使用后最好注釋掉
            4. 盡量使用try - catch(…)
            5. 盡量使用模塊,不但表達(dá)清楚而且方便調(diào)試。
            注1:
            afc(afc) 網(wǎng)友提供:
            debug版初始化成0xcc是因?yàn)?xcc在x86下是一條int 3單步中斷指令,這樣程序如果跑飛了遇到0xcc就會(huì)停下來(lái),這和單片機(jī)編程時(shí)一般將沒(méi)用的代碼空間填入jmp 0000語(yǔ)句是一樣地
            注2:
            不知大家有沒(méi)有遇到過(guò)這種情況,具體原因我也不太清楚,是不是調(diào)用時(shí)按著默認(rèn)的參數(shù)多分配了WPARAM+LPARAM的空間而破壞了應(yīng)用程序的內(nèi)存空間?還請(qǐng)高手來(lái)補(bǔ)充。
            NightWolf 網(wǎng)友提供:我遇見(jiàn)過(guò),好像是在函數(shù)調(diào)用的時(shí)候參數(shù)入棧的問(wèn)題。因?yàn)镸FC的消息使用宏寫(xiě)的,所以如果定義了OnMessage()的函數(shù),編譯能夠通過(guò),但是調(diào)用一次后,堆棧指針發(fā)生了偏移。然后就。。。
            ------------------------------------------------------------
            _________________________________________________________
            ---------------------------------------------------------




            [轉(zhuǎn)]DEBUG和RELEASE版本差異及調(diào)試相關(guān)問(wèn)題 
            I. 內(nèi)存分配問(wèn)題

            1. 變量未初始化。下面的程序在debug中運(yùn)行的很好。

            thing * search(thing * something)
            BOOL found;
            for(int i = 0; i < whatever.GetSize(); i++)
            {
            if(whatever[i]->field == something->field)
            { /* found it */
            found = TRUE;
            break;
            } /* found it */
            }
            if(found)
            return whatever[i];
            else
            return NULL;
            而在release中卻不行,因?yàn)閐ebug中會(huì)自動(dòng)給變量初始化found=FALSE,而在release版中則不會(huì)。所以盡可能的給變量、類或結(jié)構(gòu)初始化。

            2. 數(shù)據(jù)溢出的問(wèn)題

            如:char buffer[10];
            int counter;

            lstrcpy(buffer, "abcdefghik");

            在debug版中buffer的NULL覆蓋了counter的高位,但是除非counter>16M,什么問(wèn)題也沒(méi)有。但是在release版中,counter可能被放在寄存器中,這樣NULL就覆蓋了buffer下面的空間,可能就是函數(shù)的返回地址,這將導(dǎo)致ACCESS ERROR。

            3. DEBUG版和RELEASE版的內(nèi)存分配方式是不同的 。如果你在DEBUG版中申請(qǐng) ele 為 6*sizeof(DWORD)=24bytes,實(shí)際上分配給你的是32bytes(debug版以32bytes為單位分配), 而在release版,分配給你的就是24bytes(release版以8bytes為單位),所以在debug版中如果你寫(xiě)ele[6],可能不會(huì)有什么問(wèn)題,而在release版中,就有ACCESS VIOLATE。

            II. ASSERT和VERIFY

            1. ASSERT在Release版本中是不會(huì)被編譯的。

            ASSERT宏是這樣定義的

            #ifdef _DEBUG
            #define ASSERT(x) if( (x) == 0) report_assert_failure()
            #else
            #define ASSERT(x)
            #endif
            實(shí)際上復(fù)雜一些,但無(wú)關(guān)緊要。假如你在這些語(yǔ)句中加了程序中必須要有的代碼
            比如

            ASSERT(pNewObj = new CMyClass);

            pNewObj->MyFunction();

            這種時(shí)候Release版本中的pNewObj不會(huì)分配到空間

            所以執(zhí)行到下一個(gè)語(yǔ)句的時(shí)候程序會(huì)報(bào)該程序執(zhí)行了非法操作的錯(cuò)誤。這時(shí)可以用VERIFY :

            #ifdef _DEBUG
            #define VERIFY(x) if( (x) == 0) report_assert_failure()
            #else
            #define VERIFY(x) (x)
            #endif
            這樣的話,代碼在release版中就可以執(zhí)行了。

            III. 參數(shù)問(wèn)題:

            自定義消息的處理函數(shù),必須定義如下:

            afx_msg LRESULT OnMyMessage(WPARAM, LPARAM);

            返回值必須是HRESULT型,否則Debug會(huì)過(guò),而Release出錯(cuò)

            IV. 內(nèi)存分配

            保證數(shù)據(jù)創(chuàng)建和清除的統(tǒng)一性:如果一個(gè)DLL提供一個(gè)能夠創(chuàng)建數(shù)據(jù)的函數(shù),那么這個(gè)DLL同時(shí)應(yīng)該提供一個(gè)函數(shù)銷毀這些數(shù)據(jù)。數(shù)據(jù)的創(chuàng)建和清除應(yīng)該在同一個(gè)層次上。

            V. DLL的災(zāi)難

            人們將不同版本DLL混合造成的不一致性形象的稱為 “動(dòng)態(tài)連接庫(kù)的地獄“(DLL Hell) ,甚至微軟自己也這么說(shuō)http://msdn.microsoft.com/library/techart/dlldanger1.htm)。

            如果你的程序使用你自己的DLL時(shí)請(qǐng)注意:

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

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


            2. 千萬(wàn)不要以為靜態(tài)連接庫(kù)會(huì)解決問(wèn)題,那只會(huì)使情況更糟糕。

            VI. RELEASE板中的調(diào)試 :

            1. 將ASSERT() 改為 VERIFY() 。找出定義在"#ifdef _DEBUG"中的代碼,如果在RELEASE版本中需要這些代碼請(qǐng)將他們移到定義外。查找TRACE(...)中代碼,因?yàn)檫@些代碼在RELEASE中也不被編譯。 請(qǐng)認(rèn)真檢查那些在RELEASE中需要的代碼是否并沒(méi)有被便宜。

            2. 變量的初始化所帶來(lái)的不同,在不同的系統(tǒng),或是在DEBUG/RELEASE版本間都存在這樣的差異,所以請(qǐng)對(duì)變量進(jìn)行初始化。

            3. 是否在編譯時(shí)已經(jīng)有了警告?請(qǐng)將警告級(jí)別設(shè)置為3或4,然后保證在編譯時(shí)沒(méi)有警告出現(xiàn).

            VII. 將Project Settings" 中 "C++/C " 項(xiàng)目下優(yōu)化選項(xiàng)改為Disbale(Debug)。編譯器的優(yōu)化可能導(dǎo)致許多意想不到的錯(cuò)誤,請(qǐng)參http://www.pgh.net/~newcomer/debug_release.htm

            1. 此外對(duì)RELEASE版本的軟件也可以進(jìn)行調(diào)試,請(qǐng)做如下改動(dòng):

            在"Project Settings" 中 "C++/C " 項(xiàng)目下設(shè)置 "category" 為 "General" 并且將"Debug Info"設(shè)置為 "Program Database"。

            在"Link"項(xiàng)目下選中"Generate Debug Info"檢查框。

            "Rebuild All"

            如此做法會(huì)產(chǎn)生的一些限制:

            無(wú)法獲得在MFC DLL中的變量的值。

            必須對(duì)該軟件所使用的所有DLL工程都進(jìn)行改動(dòng)。

            另:

            MS BUG:MS的一份技術(shù)文檔中表明,在VC5中對(duì)于DLL的"Maximize Speed"優(yōu)化選項(xiàng)并未被完全支持,因此這將會(huì)引起內(nèi)存錯(cuò)誤并導(dǎo)致程序崩潰。

            2. http://www.sysinternals.com/有一個(gè)程序DebugView,用來(lái)捕捉OutputDebugString的輸出,運(yùn)行起來(lái)后(估計(jì)是自設(shè)為system debugger)就可以觀看所有程序的OutputDebugString的輸出。此后,你可以脫離VC來(lái)運(yùn)行你的程序并觀看調(diào)試信息。

            3. 有一個(gè)叫Gimpel Lint的靜態(tài)代碼檢查工具,據(jù)說(shuō)比較好用http://www.gimpel.com/ 不過(guò)要化$的。

            參考文獻(xiàn):

            1) http://www.cygnus-software.com/papers/release_debugging.html

            2) http://www.pgh.net/~newcomer/debug_release.htm

            posted on 2009-07-08 04:35 七星重劍 閱讀(6478) 評(píng)論(15)  編輯 收藏 引用 所屬分類: IDE -- visual c++Debug

            FeedBack:
            # re: 莫偷懶!成員變量一定要初始化! 2009-07-08 09:36 秒大刀
            有同感。一旦出現(xiàn)問(wèn)題代價(jià)會(huì)非常大,而且不初始化的變量給以后的維護(hù)工作帶來(lái)巨大的壓力,出了bug也很難查
            不省那點(diǎn)初始化的性能,讓代碼安全點(diǎn)  回復(fù)  更多評(píng)論
              
            # re: 莫偷懶!成員變量一定要初始化! 2009-07-08 15:07 唐風(fēng)
            !!
            七星重劍,出刃見(jiàn)血,哈哈。
            學(xué)習(xí)了!  回復(fù)  更多評(píng)論
              
            # re: 莫偷懶!成員變量一定要初始化! 2009-07-08 21:46 waterpg
            我也遇到過(guò)一次類似的問(wèn)題
            在release下面總出現(xiàn)一些奇怪的數(shù)據(jù),但是在debug下面一切正常
            結(jié)果就是有幾個(gè)變量沒(méi)初始化
            但調(diào)試又很麻煩,結(jié)果盯著程序猛看,竟然看出來(lái)了~~
            后來(lái)再寫(xiě)程序,只要能初始化就習(xí)慣性地初始化了  回復(fù)  更多評(píng)論
              
            # re: 莫偷懶!成員變量一定要初始化! 2009-07-12 21:25 nosound
            未初始化的成員變量,其值是“未定義”,而不是“Debug是False,Release是True”。
            “未定義”的意思是“可能出現(xiàn)一切可能的值”  回復(fù)  更多評(píng)論
              
            # re: 莫偷懶!成員變量一定要初始化! 2009-07-14 00:55 七星重劍
            @nosound
            嗯,對(duì)頭,值不一定  回復(fù)  更多評(píng)論
              
            # re: 莫偷懶!成員變量一定要初始化! 2010-03-12 16:59 Butler22Lesley
            Specialists claim that <a href="http://lowest-rate-loans.com/topics/personal-loans">personal loans</a> help a lot of people to live their own way, because they are able to feel free to buy needed things. Furthermore, banks offer student loan for all people.   回復(fù)  更多評(píng)論
              
            # re: 莫偷懶!成員變量一定要初始化! 2010-04-04 20:46 paper services
            fantastic long post!! This post very makes substance and is very very good. Though I didn’t get time to find out the whole post, I think I’ll read part by part. This is a very good option for students, who has no writing ability, instead of simply ussing paper services.  回復(fù)  更多評(píng)論
              
            # re: 莫偷懶!成員變量一定要初始化! 2010-04-06 07:50 dissertation
            Fantabulous article just about school! No doubts all of us meet whatever problems with dissertation writing. It is particularly problematic when you get another vantage in life. I have had the identical problems until I have see a company supply experienced writing services.  回復(fù)  更多評(píng)論
              
            # re: 莫偷懶!成員變量一定要初始化! 2010-04-10 12:26 essays help
            The essay writing service could be organized peculiarly for college students, just because they need the critical essays written correctly.   回復(fù)  更多評(píng)論
              
            # re: 莫偷懶!成員變量一定要初始化! 2010-04-18 15:45 paper writing
            Really a informative and edifying post, the post is smashing in all regards,I am pleased to read this post. If every single writer is as good as you are, people will ne'er have problems with buy paper. Thanks.  回復(fù)  更多評(píng)論
              
            # re: 莫偷懶!成員變量一定要初始化![未登錄](méi) 2010-07-14 17:39 jerry
            是的
            我也是遇到了這個(gè)問(wèn)題
            搞了兩天才發(fā)現(xiàn) 原來(lái)是一個(gè)類成員的布爾型私有變量沒(méi)有初始化
            而且在windows下的vs2008編譯運(yùn)行 一切正常 結(jié)果也對(duì)
            而在linux下編譯運(yùn)行沒(méi)有任何意外 可是就是結(jié)果不對(duì)
            一直跟蹤到內(nèi)部才發(fā)現(xiàn)原來(lái)是有個(gè)bool變量沒(méi)有初始化
            faint!
            不過(guò)好像vs2008對(duì)于其沒(méi)有初始化的布爾型私有變量的賦值是true吧
            好象不是false哦
            而其無(wú)論是debug模式還是release模式好像都是一樣的
            不知道是不是這樣  回復(fù)  更多評(píng)論
              
            # re: 莫偷懶!成員變量一定要初始化! 2010-07-24 08:40 europe essays
            When people are not sure what to select, essay or humanities essays paper, they can turn to you, just because you know the way to create the hot theme associated with this good topic.   回復(fù)  更多評(píng)論
              
            # re: 莫偷懶!成員變量一定要初始化! 2010-08-11 22:34 book reports essay paper
            Don't you acknowledge what freedom looks like? At time you do not complete your technology essays paper, but custom papers writing service provides you with research paper, you will bw able to see the real freedom.   回復(fù)  更多評(píng)論
              
            # re: 莫偷懶!成員變量一定要初始化! 2011-09-25 14:37 articles submit
            In fact, I require article submissions stuff offered by article submission directory company. I heard that was a very efficient system of online business optimization.   回復(fù)  更多評(píng)論
              
            # re: 莫偷懶!成員變量一定要初始化! 2011-09-30 04:03 term paper online
            If you are embarrassed and do not know the way to create the annotated bibliography writing, you would have an opportunity to buy custom essay in the modern research paper writing service. That can save valuable time.   回復(fù)  更多評(píng)論
              
            # re: 莫偷懶!成員變量一定要初始化! 2011-09-30 05:14 writing essays
            Not every high school student is faultless. Moreover, I guess that a professional essay service should assist every student with an essay term paper completing.   回復(fù)  更多評(píng)論
              
            # re: 莫偷懶!成員變量一定要初始化! 2012-08-21 07:37 essay writing services uk
            You should go for this writing service when you wish to acquire papers service uk. Log ontoWeb site (supremeessays.co.uk) and take a break.  回復(fù)  更多評(píng)論
              
            久久精品九九亚洲精品天堂 | 久久久无码人妻精品无码| 久久精品国产只有精品2020 | 亚洲国产另类久久久精品黑人| 亚洲?V乱码久久精品蜜桃 | 久久久久久国产精品免费免费| 欧美777精品久久久久网| 精品免费久久久久久久| 久久精品国产一区| 久久丝袜精品中文字幕| 亚洲国产精品成人久久蜜臀| 一本一道久久a久久精品综合 | 亚洲国产精品热久久| 美女久久久久久| 精品久久久中文字幕人妻| 久久久亚洲欧洲日产国码aⅴ| 国产精品久久成人影院| 久久国产高清一区二区三区| 热久久视久久精品18| 久久婷婷国产综合精品| 久久成人18免费网站| 囯产精品久久久久久久久蜜桃| 久久国产精品成人影院| 久久996热精品xxxx| 91麻豆国产精品91久久久| 国产99久久精品一区二区| 激情久久久久久久久久| 中文字幕久久亚洲一区| 99久久精品费精品国产一区二区 | 国产精品久久久久国产A级| 久久美女人爽女人爽| 一级a性色生活片久久无| 国内精品久久久久伊人av| 亚洲婷婷国产精品电影人久久| 精品无码久久久久久尤物| 久久强奷乱码老熟女| 久久九九青青国产精品| 亚洲欧美日韩中文久久| 一本综合久久国产二区| 久久久久国产视频电影| 国内精品久久久久|