注冊(cè) 登錄
Office中國(guó)論壇/Access中國(guó)論壇 返回首頁(yè)

ganlinlao的個(gè)人空間 http://ctxi.cn/?230471 [收藏] [復(fù)制] [分享] [RSS]

日志

freebasic菜鳥(niǎo)初學(xué)Freebasic基礎(chǔ)教程十三:代碼調(diào)試及導(dǎo)出函數(shù)

熱度 1已有 5414 次閱讀2017-5-17 21:26 |個(gè)人分類:FreeBasic| FreeBasic基礎(chǔ), Freebasic入門(mén), FreeBasic教程, FreeBasic基礎(chǔ), Freebasic入門(mén), FreeBasic教程, FreeBasic基礎(chǔ), Freebasic入門(mén), FreeBasic教程

        調(diào)試功能一般是編輯器提供的,很遺憾的是Freebasic目前最成熟的編輯器是FBEdit,這個(gè)編輯器提供單步調(diào)試功能,輸出窗口,但調(diào)試功能跟vb6和vs比較,還是差得比較遠(yuǎn)。freebasic論壇上還有一個(gè)FBdebugger,這款debugger風(fēng)格還是接近c(diǎn)/c++風(fēng)格,支持debug版exe運(yùn)行調(diào)試,支持多線程調(diào)試。而我使用WinFBE,甚至連調(diào)試功能還沒(méi)有提供?傮w來(lái)說(shuō),F(xiàn)reebasic各個(gè)編輯器的調(diào)試功能都比較弱。
        幾乎適用于c/c++的調(diào)試工具,也同樣適用在Freebasic上。如強(qiáng)大微軟的winDBG,小巧的dbgView,Gcc官方的DBG.exe,具體使用教程,可以搜索一下。
        接下來(lái),我們來(lái)看看網(wǎng)絡(luò)上總結(jié)的代碼調(diào)試技巧
 ======================================================       

在調(diào)試程序時(shí),輸出調(diào)試信息是一種普遍、有效的方法。輸出調(diào)試信息一般有以下五種方法:

       方法一:直接使用屏幕打印函數(shù)print。

該方法直接在需要輸出調(diào)試信息的位置使用函數(shù)printf輸出相應(yīng)的調(diào)試信息,以及某些關(guān)鍵變量的值。

      方法二:自定義調(diào)試函數(shù)debug。

為了避免方法一的缺點(diǎn),可以利用條件編譯技術(shù),自定義調(diào)試函數(shù)debug。當(dāng)程序正式發(fā)布的編譯時(shí)取消宏定義__DEBUG__,在正式發(fā)布的程序中就不會(huì)輸出調(diào)試信息。若又出現(xiàn)bug,只要重新在編譯程序時(shí)定義宏__DEBUG__即可恢復(fù)原來(lái)的調(diào)試信息輸出?梢栽诰帉(xiě)程序時(shí)就有目的事先插入些調(diào)試語(yǔ)句,這將有益于調(diào)試程序。另外,可以根據(jù)需要編寫(xiě)函數(shù)debug,將調(diào)試信息輸出到除屏幕以外的其它地方,如文件或syslog服務(wù)器等。 

該方法的缺點(diǎn)是(1)調(diào)試信息要么全部輸出,要么全不輸出;(2)要重新輸出調(diào)試信息時(shí)需要重新編譯程序。

      方法三:含調(diào)試等級(jí)的自定義調(diào)試函數(shù)debug。

可以繼續(xù)改進(jìn)方法,避免方法二中的缺點(diǎn)。我們可以根據(jù)調(diào)試信息的細(xì)節(jié)程度,將調(diào)試信息分成不同的等級(jí)。調(diào)試信息的等級(jí)必須大于0,若調(diào)試信息細(xì)節(jié)程度越高,則等級(jí)越高。在輸出調(diào)試信息時(shí),若調(diào)試等級(jí)高于調(diào)試信息等級(jí)才輸出調(diào)試信息,否則忽略該調(diào)試信息。當(dāng)調(diào)試等級(jí)為0時(shí),則不輸出任何調(diào)試信息。

這樣,在正式發(fā)布版中包含調(diào)試信息也無(wú)傷大雅了,因?yàn)橹恍鑼⒄{(diào)試等級(jí)配置為0,將不會(huì)出現(xiàn)任何調(diào)試信息。

該方法的缺點(diǎn)是效率不太高,因?yàn)椴还苷{(diào)試信息是否需要輸出,都會(huì)進(jìn)行一次函數(shù)調(diào)用。若不需要輸出調(diào)試信息,這次函數(shù)調(diào)用就多余了。

       方法四:調(diào)試等級(jí)的判斷放在自定義調(diào)試函數(shù)debug之外。

為了減少不必要的函數(shù)調(diào)用,可以用宏定義將調(diào)試等級(jí)的判斷放在函數(shù)debug之外
       調(diào)試等級(jí)的判斷放在自定義調(diào)試函數(shù)debug之外

這種方法對(duì)于不需要輸出的高等級(jí)的調(diào)試信息操作來(lái)說(shuō),僅僅多了個(gè)兩個(gè)整數(shù)之間的大小判斷。在正式的程序運(yùn)行時(shí),效率是有所提高的。

但這種調(diào)試信息輸出的方法依然不夠完美。對(duì)于一個(gè)大項(xiàng)目,一般分為若干個(gè)模塊,bug將會(huì)定位到某個(gè)或某幾個(gè)模塊。若整個(gè)項(xiàng)目的調(diào)試信息都輸出,信息量將會(huì)非常大,也容易干擾調(diào)試人員的思維。這時(shí),我們需要的是只輸出我們關(guān)心的那些模塊的調(diào)試信息,但該方法并不能達(dá)到我們的要求。它只能根據(jù)調(diào)試等級(jí)輸出信息,對(duì)于同一調(diào)試等級(jí)的信息要么全輸出,要么全不輸出。

        方法五:根據(jù)不同的功能模塊分別定義不同的調(diào)試等級(jí)。

在squid[1]中,定義了以下的功能模塊調(diào)試等級(jí)變量和調(diào)試函數(shù):

 int debugLevels[MAX_DEBUG_SECTIONS];
 #define debug(SECTION, LEVEL) /
         ((_db_level = (LEVEL)) > debugLevels[SECTION]) ? (void) 0 : _db_print

然后在程序中如下使用它:

     debug(17, 3) ("fwdStateFree: %p/n", fwdState);

上述調(diào)試函數(shù)很靈活,可以在不同的模塊中定義有不同的調(diào)試等級(jí),當(dāng)需要調(diào)試某功能時(shí),只需將該模塊的調(diào)試等級(jí)定義為相應(yīng)的等級(jí),就可輸出需要的調(diào)試信息。

========================================================    
       這是一段來(lái)自afx庫(kù)的帶調(diào)試功能的宏定義,寫(xiě)得蠻規(guī)范的,我們可以借鑒
       #ifndef _CWSTR_DEBUG_
      #define _CWSTR_DEBUG_ 0
     #endif
    #ifndef _CWSTR_DP_
     #define _CWSTR_DP_ 1
           #MACRO CWSTR_DP(st)
            #IF (_CWSTR_DEBUG_ = 1)
            OutputDebugStringW(st)     'outPutDebugString()是微軟使用的調(diào)試代碼,可以被任何調(diào)試工具捕獲得到。
           #ENDIF
          #ENDMACRO
    #endif

發(fā)表評(píng)論 評(píng)論 (1 個(gè)評(píng)論)

回復(fù) admin 2017-5-21 19:19
強(qiáng)!,贊!

facelist doodle 涂鴉板

您需要登錄后才可以評(píng)論 登錄 | 注冊(cè)

QQ|站長(zhǎng)郵箱|小黑屋|手機(jī)版|Office中國(guó)/Access中國(guó) ( 粵ICP備10043721號(hào)-1 )  

GMT+8, 2024-10-23 08:39 , Processed in 0.063112 second(s), 18 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

返回頂部