熱度 1||
在調(diào)試程序時,輸出調(diào)試信息是一種普遍、有效的方法。輸出調(diào)試信息一般有以下五種方法:
方法一:直接使用屏幕打印函數(shù)print。
該方法直接在需要輸出調(diào)試信息的位置使用函數(shù)printf輸出相應的調(diào)試信息,以及某些關(guān)鍵變量的值。
為了避免方法一的缺點,可以利用條件編譯技術(shù),自定義調(diào)試函數(shù)debug。當程序正式發(fā)布的編譯時取消宏定義__DEBUG__,在正式發(fā)布的程序中就不會輸出調(diào)試信息。若又出現(xiàn)bug,只要重新在編譯程序時定義宏__DEBUG__即可恢復原來的調(diào)試信息輸出?梢栽诰帉懗绦驎r就有目的事先插入些調(diào)試語句,這將有益于調(diào)試程序。另外,可以根據(jù)需要編寫函數(shù)debug,將調(diào)試信息輸出到除屏幕以外的其它地方,如文件或syslog服務器等。
該方法的缺點是(1)調(diào)試信息要么全部輸出,要么全不輸出;(2)要重新輸出調(diào)試信息時需要重新編譯程序。
方法三:含調(diào)試等級的自定義調(diào)試函數(shù)debug。
可以繼續(xù)改進方法,避免方法二中的缺點。我們可以根據(jù)調(diào)試信息的細節(jié)程度,將調(diào)試信息分成不同的等級。調(diào)試信息的等級必須大于0,若調(diào)試信息細節(jié)程度越高,則等級越高。在輸出調(diào)試信息時,若調(diào)試等級高于調(diào)試信息等級才輸出調(diào)試信息,否則忽略該調(diào)試信息。當調(diào)試等級為0時,則不輸出任何調(diào)試信息。
這樣,在正式發(fā)布版中包含調(diào)試信息也無傷大雅了,因為只需將調(diào)試等級配置為0,將不會出現(xiàn)任何調(diào)試信息。
該方法的缺點是效率不太高,因為不管調(diào)試信息是否需要輸出,都會進行一次函數(shù)調(diào)用。若不需要輸出調(diào)試信息,這次函數(shù)調(diào)用就多余了。
方法四:調(diào)試等級的判斷放在自定義調(diào)試函數(shù)debug之外。
為了減少不必要的函數(shù)調(diào)用,可以用宏定義將調(diào)試等級的判斷放在函數(shù)debug之外
調(diào)試等級的判斷放在自定義調(diào)試函數(shù)debug之外
這種方法對于不需要輸出的高等級的調(diào)試信息操作來說,僅僅多了個兩個整數(shù)之間的大小判斷。在正式的程序運行時,效率是有所提高的。
但這種調(diào)試信息輸出的方法依然不夠完美。對于一個大項目,一般分為若干個模塊,bug將會定位到某個或某幾個模塊。若整個項目的調(diào)試信息都輸出,信息量將會非常大,也容易干擾調(diào)試人員的思維。這時,我們需要的是只輸出我們關(guān)心的那些模塊的調(diào)試信息,但該方法并不能達到我們的要求。它只能根據(jù)調(diào)試等級輸出信息,對于同一調(diào)試等級的信息要么全輸出,要么全不輸出。
方法五:根據(jù)不同的功能模塊分別定義不同的調(diào)試等級。
在squid[1]中,定義了以下的功能模塊調(diào)試等級變量和調(diào)試函數(shù):
int debugLevels[MAX_DEBUG_SECTIONS];然后在程序中如下使用它:
debug(17, 3) ("fwdStateFree: %p/n", fwdState);上述調(diào)試函數(shù)很靈活,可以在不同的模塊中定義有不同的調(diào)試等級,當需要調(diào)試某功能時,只需將該模塊的調(diào)試等級定義為相應的等級,就可輸出需要的調(diào)試信息。
========================================================
|站長郵箱|小黑屋|手機版|Office中國/Access中國
( 粵ICP備10043721號-1 )
GMT+8, 2025-7-13 03:11 , Processed in 0.076445 second(s), 18 queries .
Powered by Discuz! X3.3
© 2001-2017 Comsenz Inc.