• <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
            <2009年7月>
            2829301234
            567891011
            12131415161718
            19202122232425
            2627282930311
            2345678


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

            常用鏈接

            留言簿(94)

            隨筆分類(649)

            隨筆檔案(505)

            相冊

            BCB

            Crytek

            • crymod
            • Crytek's Offical Modding Portal

            Game Industry

            OGRE

            other

            Programmers

            Qt

            WOW Stuff

            搜索

            •  

            積分與排名

            • 積分 - 911842
            • 排名 - 14

            最新隨筆

            最新評論

            閱讀排行榜

            評論排行榜

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

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

            另可參考:
            [轉(zhuǎn)]DEBUG和RELEASE版本差異及調(diào)試相關(guā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支持,主要看你采用的編譯選項。如果是基于ATL的,則Debug和Release版本對DLL的要求差不多。如果采用的編譯選項為使用MFC動態(tài)庫,則需要MFC42D.DLL等庫支持,而Release版本需要MFC42.DLL支持。Release   Build不對源代碼進(jìn)行調(diào)試,不考慮MFC的診斷宏,使用的是MFC   Release庫,編譯十對應(yīng)用程序的速度進(jìn)行優(yōu)化,而Debug   Build則正好相反,它允許對源代碼進(jìn)行調(diào)試,可以定義和使用MFC的診斷宏,采用MFC   Debug庫,對速度沒有優(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   的真正秘密,在于一組編譯選項。下面列出了分別針對二者的選項(當(dāng)然除此之外還有其他一些,如/Fd   /Fo,但區(qū)別并不重要,通常他們也不會引起   Release   版錯誤,在此不討論)  

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

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

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

            二、哪些情況下   Release   版會出錯  

            有了上面的介紹,我們再來逐個對照這些選項看看   Release   版錯誤是怎樣產(chǎn)生的  

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

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

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

            ●   MFC   消息響應(yīng)函數(shù)書寫錯誤。正確的應(yīng)為  
            afx_msg   LRESULT   OnMessageOwn(WPARAM   wparam,   LPARAM   lparam);  
            ON_MESSAGE   宏包含強(qiáng)制類型轉(zhuǎn)換。防止這種錯誤的方法之一是重定義   ON_MESSAGE   宏,把下列代碼加到   stdafx.h   中(在#include   "afxwin.h"之后),函數(shù)原形錯誤時編譯會報錯  
            #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)化程序為了使程序性能提高,常把一些變量放在寄存器中(類似于   register   關(guān)鍵字),而其他進(jìn)程只能對該變量所在的內(nèi)存進(jìn)行修改,而寄存器中的值沒變。如果你的程序是多線程的,或者你發(fā)現(xiàn)某個變量的值與預(yù)期的不符而你確信已正確的設(shè)置了,則很可能遇到這樣的問題。這種錯誤有時會表現(xiàn)為程序在最快優(yōu)化出錯而最小優(yōu)化正常。把你認(rèn)為可疑的變量加上   volatile   試試。  

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

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

            4.   /GZ   選項:這個選項會做以下這些事  

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

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

            除此之外,/Gm   /GF   等選項造成錯誤的情況比較少,而且他們的效果顯而易見,比較容易發(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)試輸出語句。REALEASE不包含任何調(diào)試信息,所以體積小、運(yùn)行速度快。  

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


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

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

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

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

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

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

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

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




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

            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中卻不行,因為debug中會自動給變量初始化found=FALSE,而在release版中則不會。所以盡可能的給變量、類或結(jié)構(gòu)初始化。

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

            如:char buffer[10];
            int counter;

            lstrcpy(buffer, "abcdefghik");

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

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

            II. ASSERT和VERIFY

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

            ASSERT宏是這樣定義的

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

            ASSERT(pNewObj = new CMyClass);

            pNewObj->MyFunction();

            這種時候Release版本中的pNewObj不會分配到空間

            所以執(zhí)行到下一個語句的時候程序會報該程序執(zhí)行了非法操作的錯誤。這時可以用VERIFY :

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

            III. 參數(shù)問題:

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

            afx_msg LRESULT OnMyMessage(WPARAM, LPARAM);

            返回值必須是HRESULT型,否則Debug會過,而Release出錯

            IV. 內(nèi)存分配

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

            V. DLL的災(zāi)難

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

            如果你的程序使用你自己的DLL時請注意:

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

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


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

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

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

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

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

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

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

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

            在"Link"項目下選中"Generate Debug Info"檢查框。

            "Rebuild All"

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

            無法獲得在MFC DLL中的變量的值。

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

            另:

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

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

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

            參考文獻(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 七星重劍 閱讀(6438) 評論(15)  編輯 收藏 引用 所屬分類: IDE -- visual c++Debug

            FeedBack:
            # re: 莫偷懶!成員變量一定要初始化! 2009-07-08 09:36 秒大刀
            有同感。一旦出現(xiàn)問題代價會非常大,而且不初始化的變量給以后的維護(hù)工作帶來巨大的壓力,出了bug也很難查
            不省那點(diǎn)初始化的性能,讓代碼安全點(diǎn)  回復(fù)  更多評論
              
            # re: 莫偷懶!成員變量一定要初始化! 2009-07-08 15:07 唐風(fēng)
            !!
            七星重劍,出刃見血,哈哈。
            學(xué)習(xí)了!  回復(fù)  更多評論
              
            # re: 莫偷懶!成員變量一定要初始化! 2009-07-08 21:46 waterpg
            我也遇到過一次類似的問題
            在release下面總出現(xiàn)一些奇怪的數(shù)據(jù),但是在debug下面一切正常
            結(jié)果就是有幾個變量沒初始化
            但調(diào)試又很麻煩,結(jié)果盯著程序猛看,竟然看出來了~~
            后來再寫程序,只要能初始化就習(xí)慣性地初始化了  回復(fù)  更多評論
              
            # re: 莫偷懶!成員變量一定要初始化! 2009-07-12 21:25 nosound
            未初始化的成員變量,其值是“未定義”,而不是“Debug是False,Release是True”。
            “未定義”的意思是“可能出現(xiàn)一切可能的值”  回復(fù)  更多評論
              
            # re: 莫偷懶!成員變量一定要初始化! 2009-07-14 00:55 七星重劍
            @nosound
            嗯,對頭,值不一定  回復(fù)  更多評論
              
            # 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ù)  更多評論
              
            # 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ù)  更多評論
              
            # 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ù)  更多評論
              
            # 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ù)  更多評論
              
            # 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ù)  更多評論
              
            # re: 莫偷懶!成員變量一定要初始化![未登錄] 2010-07-14 17:39 jerry
            是的
            我也是遇到了這個問題
            搞了兩天才發(fā)現(xiàn) 原來是一個類成員的布爾型私有變量沒有初始化
            而且在windows下的vs2008編譯運(yùn)行 一切正常 結(jié)果也對
            而在linux下編譯運(yùn)行沒有任何意外 可是就是結(jié)果不對
            一直跟蹤到內(nèi)部才發(fā)現(xiàn)原來是有個bool變量沒有初始化
            faint!
            不過好像vs2008對于其沒有初始化的布爾型私有變量的賦值是true吧
            好象不是false哦
            而其無論是debug模式還是release模式好像都是一樣的
            不知道是不是這樣  回復(fù)  更多評論
              
            # 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ù)  更多評論
              
            # 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ù)  更多評論
              
            # 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ù)  更多評論
              
            # 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ù)  更多評論
              
            # 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ù)  更多評論
              
            # 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ù)  更多評論
              
            91精品日韩人妻无码久久不卡| 久久精品a亚洲国产v高清不卡| 国产精品久久成人影院| 成人午夜精品无码区久久| 亚洲色欲久久久久综合网 | 婷婷久久精品国产| 久久精品中文字幕无码绿巨人| 久久久国产精品网站| 久久国产免费观看精品3| 久久WWW免费人成一看片| 中文字幕精品久久久久人妻| 久久精品国产99久久丝袜| 久久国产精品免费一区| 久久se这里只有精品| 久久嫩草影院免费看夜色| 久久精品国产精品亚洲艾草网美妙 | 91超碰碰碰碰久久久久久综合| 久久夜色精品国产亚洲| 青青草国产精品久久| 精品久久久久久无码中文野结衣| 国产精品久久久99| 国产精品久久新婚兰兰| 亚洲国产精品久久电影欧美| 91精品国产9l久久久久| 国产精品久久久久乳精品爆 | 久久久久久久久久免免费精品| 久久久久久久久久久免费精品| 日韩人妻无码一区二区三区久久99| 7777久久久国产精品消防器材| 久久人人爽爽爽人久久久| 亚洲伊人久久大香线蕉苏妲己| 亚洲&#228;v永久无码精品天堂久久 | 久久99精品久久只有精品| 青青青伊人色综合久久| 亚洲欧美日韩精品久久亚洲区| 精品国产青草久久久久福利| 久久99精品国产一区二区三区| 久久精品中文字幕有码| 久久久一本精品99久久精品88| 久久精品国产亚洲综合色| 亚洲乱码日产精品a级毛片久久|