• <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>

            每天早晨叫醒你的不是鬧鐘,而是夢想

              C++博客 :: 首頁 :: 聯(lián)系 :: 聚合  :: 管理
              62 Posts :: 0 Stories :: 5 Comments :: 0 Trackbacks

            常用鏈接

            留言簿(1)

            我參與的團(tuán)隊(duì)

            搜索

            •  

            最新評論

            閱讀排行榜

            評論排行榜

            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版本對DLL的要求差不多。如果采用的編譯選項(xiàng)為使用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   的真正秘密,在于一組編譯選項(xiàng)。下面列出了分別針對二者的選項(xiàng)(當(dāng)然除此之外還有其他一些,如/Fd   /Fo,但區(qū)別并不重要,通常他們也不會引起   Release   版錯(cuò)誤,在此不討論) 

            Debug   版本: 
            /MDd   /MLd   或   /MTd   使用   Debug   runtime   library(調(diào)試版本的運(yùn)行時(shí)刻函數(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)存錯(cuò)誤 
            /Gm   打開最小化重鏈接開關(guān),減少鏈接時(shí)間 

            Release   版本:   
            /MD   /ML   或   /MT   使用發(fā)布版本的運(yùn)行時(shí)刻函數(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ì)的界限,他們只是一組編譯選項(xiàng)的集合,編譯器只是按照預(yù)定的選項(xiàng)行動。事實(shí)上,我們甚至可以修改這些選項(xiàng),從而得到優(yōu)化過的調(diào)試版本或是帶跟蹤語句的發(fā)布版本。 

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

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

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

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

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

            ●   MFC   消息響應(yīng)函數(shù)書寫錯(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í)編譯會報(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)程只能對該變量所在的內(nèi)存進(jìn)行修改,而寄存器中的值沒變。如果你的程序是多線程的,或者你發(fā)現(xiàn)某個(gè)變量的值與預(yù)期的不符而你確信已正確的設(shè)置了,則很可能遇到這樣的問題。這種錯(cuò)誤有時(shí)會表現(xiàn)為程序在最快優(yōu)化出錯(cuò)而最小優(yōu)化正常。把你認(rèn)為可疑的變量加上   volatile   試試。 

            (3)   變量優(yōu)化:優(yōu)化程序會根據(jù)變量的使用情況優(yōu)化變量。例如,函數(shù)中有一個(gè)未被使用的變量,在   Debug   版中它有可能掩蓋一個(gè)數(shù)組越界,而在   Release   版中,這個(gè)變量很可能被優(yōu)化調(diào),此時(shí)數(shù)組越界會破壞棧中有用的數(shù)據(jù)。當(dāng)然,實(shí)際的情況會比這復(fù)雜得多。與此有關(guān)的錯(cuò)誤有: 
            ●   非法訪問,包括數(shù)組越界、指針錯(cuò)誤等。例如 
            void   fn(void) 

            int   i; 
            i   =   1; 
            int   a[4]; 

            int   j; 
            j   =   1; 

            a[-1]   =   1;//當(dāng)然錯(cuò)誤不會這么明顯,例如下標(biāo)是變量 
            a[4]   =   1; 

            j   雖然在數(shù)組越界時(shí)已出了作用域,但其空間并未收回,因而   i   和   j   就會掩蓋越界。而   Release   版由于   i、j   并未其很大作用可能會被優(yōu)化掉,從而使棧被破壞。 

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

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

            (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í)錯(cuò)誤),作為數(shù)值也很少遇到,而且這些值也很容易辨認(rèn),因此這很有利于在   Debug   版中發(fā)現(xiàn)   Release   版才會遇到的錯(cuò)誤。要特別注意的是,很多人認(rèn)為編譯器會用   0   來初始化變量,這是錯(cuò)誤的(而且這樣很不利于查找錯(cuò)誤)。 
            (2)   通過函數(shù)指針調(diào)用函數(shù)時(shí),會通過檢查棧指針驗(yàn)證函數(shù)調(diào)用的匹配性。(防止原形不匹配) 
            (3)   函數(shù)返回前檢查棧指針,確認(rèn)未被修改。(防止越界訪問和原形不匹配,與第二項(xiàng)合在一起可大致模擬幀指針省略   FPO   ) 

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

            除此之外,/Gm   /GF   等選項(xiàng)造成錯(cuò)誤的情況比較少,而且他們的效果顯而易見,比較容易發(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)要享受那種興奮的時(shí)候突然發(fā)現(xiàn):release與debug運(yùn)行結(jié)果不一致,甚至出錯(cuò),而release又不方便調(diào)試,真的是當(dāng)頭一棒啊,可是疼歸疼,問題總要解決,下面將講述一下我的幾點(diǎn)經(jīng)驗(yàn),看看是不是其中之一:

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

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

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

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

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

            1. 注意變量的初始化,尤其是指針變量,數(shù)組變量的初始化(很大的情況下另作考慮了)。
            2. 自定義消息及其他聲明的標(biāo)準(zhǔn)寫法
            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就會停下來,這和單片機(jī)編程時(shí)一般將沒用的代碼空間填入jmp 0000語句是一樣地
            注2:
            不知大家有沒有遇到過這種情況,具體原因我也不太清楚,是不是調(diào)用時(shí)按著默認(rèn)的參數(shù)多分配了WPARAM+LPARAM的空間而破壞了應(yīng)用程序的內(nèi)存空間?還請高手來補(bǔ)充。
            NightWolf 網(wǎng)友提供:我遇見過,好像是在函數(shù)調(diào)用的時(shí)候參數(shù)入棧的問題。因?yàn)镸FC的消息使用宏寫的,所以如果定義了OnMessage()的函數(shù),編譯能夠通過,但是調(diào)用一次后,堆棧指針發(fā)生了偏移。然后就。。。
            ------------------------------------------------------------
            _________________________________________________________
            ---------------------------------------------------------
            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中卻不行,因?yàn)閐ebug中會自動給變量初始化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();

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

            所以執(zhí)行到下一個(gè)語句的時(shí)候程序會報(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ù)問題:

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

            afx_msg LRESULT OnMyMessage(WPARAM, LPARAM);

            返回值必須是HRESULT型,否則Debug會過,而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混合造成的不一致性形象的稱為 “動態(tài)連接庫的地獄“(DLL Hell) ,甚至微軟自己也這么說(http://msdn.microsoft.com/library/techart/dlldanger1.htm)。

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

            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(...)中代碼,因?yàn)檫@些代碼在RELEASE中也不被編譯。 請認(rèn)真檢查那些在RELEASE中需要的代碼是否并沒有被便宜。

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

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

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

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

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

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

            "Rebuild All"

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

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

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

            另:

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

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

            3.          有一個(gè)叫Gimpel Lint的靜態(tài)代碼檢查工具,據(jù)說比較好用。

             

            本文來自CSDN博客,轉(zhuǎn)載請標(biāo)明出處:http://blog.csdn.net/Jiao2_vc/archive/2009/03/07/3967364.aspx

            posted on 2011-04-29 10:48 沛沛 閱讀(353) 評論(0)  編輯 收藏 引用 所屬分類: C++
            99久久免费国产特黄| 久久99国产精品二区不卡| 久久天天躁狠狠躁夜夜96流白浆| 久久久久久亚洲精品无码| 久久久久四虎国产精品| 人人狠狠综合久久亚洲88| 亚洲精品国精品久久99热一| 久久婷婷五月综合97色直播| 少妇熟女久久综合网色欲| 久久天天躁狠狠躁夜夜avapp| 久久久久se色偷偷亚洲精品av| 免费精品久久天干天干| 亚洲国产精品成人久久| 久久精品亚洲日本波多野结衣| 亚洲国产精品久久久久| 伊人伊成久久人综合网777| 麻豆成人久久精品二区三区免费| 亚洲欧美日韩中文久久| 91精品国产9l久久久久| 天天久久狠狠色综合| 丁香久久婷婷国产午夜视频| 久久久久亚洲av成人无码电影| 性欧美丰满熟妇XXXX性久久久 | 久久精品国产一区二区| 久久无码一区二区三区少妇 | 狠狠色丁香婷婷久久综合| 日本WV一本一道久久香蕉| 久久久精品国产sm调教网站| 日本一区精品久久久久影院| 亚洲国产天堂久久综合| 天天躁日日躁狠狠久久| 99久久精品无码一区二区毛片| 久久受www免费人成_看片中文| 久久综合丁香激情久久| 无码8090精品久久一区| 国产精品日韩欧美久久综合| 久久久久久亚洲精品影院| 久久免费精品视频| 亚洲女久久久噜噜噜熟女| 亚洲午夜久久久精品影院| 久久久久久久久久久精品尤物|