VC中用於除錯程式的幾個巨集的使用技巧

2021-04-12 21:13:23 字數 2003 閱讀 2764

一、trace巨集

當選擇了debug目標,並且afxtraceenabled變數被置為true時,trace巨集也就隨之被啟用了。但在程式的release版本中,它們是被完全禁止的。下面是乙個典型的trace語句: …

int ncount =9;

cstring strdesc("total");

trace("count =%d,description =%s/n",ncount,strdesc); …

可以看到,trace語句的工作方式有點像c語言中的printf語句,trace巨集引數的個數是可變的,因此使用起來非常容易。如果檢視mfc的源**,你根本找不到trace巨集,而只能看到trace0、trace1、trace2和trace3巨集,它們的引數分別為0、1、2、3。

二、assert巨集

如果你設計了乙個函式,該函式需要乙個指向文件物件的指標做引數,但是你卻錯誤地用乙個檢視指標呼叫了這個函式。這個假的位址將導致視資料的破壞。現在,這種型別的問題可以被完全避免,只要在該函式的開始處實現乙個assert測試,用來檢測該指標是否真正指向乙個文件物件。一般來講,程式設計者在每個函式的開始處均應例行公事地使用assertion。assert巨集將會判斷表示式,如果乙個表示式為真,執行將繼續,否則,程式將顯示一條訊息並且暫停,你可以選擇忽視這條錯誤並繼續、終止這個程式或者是跳到debug器中。下面一例演示了如何使用乙個assert巨集去驗證乙個語句。

void foo( char p, int size )  

這些語句不產生任何**,除非—debug處理器標誌被設定。visual c++只在debug版本設定這些標誌,而在release版本不定義這些標誌。當—debug被定義時,兩個assertions將產生如下**:

//assert( p != 0 );

dowhile(0);

//assert((size 〉= 100);

dowhile(0);

do-while迴圈將整個assertion封裝在乙個單獨的程式塊中,使得編譯器編譯起來很舒暢。if語句將求取表示式的值並且當結果為零時呼叫afxassertfailedline()函式。這個函式將彈出乙個對話方塊,其中提供三個選項「取消、重試或忽略」,當你選取「重試」時,它將返回true。重試將導致對afxdebugbreak()函式的呼叫,從而啟用偵錯程式。

do-while迴圈將整個assertion封裝在乙個單獨的程式塊中,使得編譯器編譯起來很舒暢。if語句將求取表示式的值並且當結果為零時呼叫afxassertfailedline()函式。這個函式將彈出乙個對話方塊,其中提供三個選項「取消、重試或忽略」,當你選取「重試」時,它將返回true。重試將導致對afxdebugbreak()函式的呼叫,從而啟用偵錯程式。

afxassertfailedline()是乙個未正式公布的函式,它的功能就是顯示乙個訊息框。該函式的源**駐留在afxasert.cpp中。函式中的—file—和—line—語句是處理器標誌,它們分別指定了源檔名和當前的行號。

afxassertfailedline()是乙個未正式公布的函式,它的功能就是顯示乙個訊息框。該函式的源**駐留在afxasert.cpp中。函式中的—file—和—line—語句是處理器標誌,它們分別指定了源檔名和當前的行號。

三、verify 巨集

因為assertion只能在程式的debug版本中起作用,在表示式中不可以包含賦值語句、增加語句(++)或者是減少語句(--),因為,這些語句實際改變資料。可有時你可能想要驗證乙個能動的表示式,使用乙個賦值語句。那麼就到了用verify巨集來替代assert。例如:

void foo(char p, int size )

在debug模式下,assert和verify是一回事,但是在release模式下,verify巨集仍然測試表示式而assertion卻不起任何作用。可以說,在release模式下,assert語句被刪除了。

請注意,如果你在乙個assert語句中錯誤地使用了乙個能動的表示式,編譯器將不做任何警告地忽略它。在release模式下,該表示式就會被無聲息地刪除掉,這將會導致程式的錯誤執行。由於release版的程式通常不包含debug資訊,這類錯誤將很難被發現。

用於除錯的巨集

在linux程式設計中,gdb是個不錯的除錯工具。但是當檔案數量上百,甚至上千之後,使用gdb除錯就是一場災難。因此在程式中加入合理的列印資訊,能更高效的定位到問題的所在。下面就是定義的巨集。分別是warning,info,error。利用了,file function line 變數。cpp vi...

除錯程式的利器 printf

宣告 這些內容主要是面向c語言的初學者,尤其是正在學習c語言的學生。當排除了所有的語法錯誤,但執行結果卻不正確時,很多初學者往往束手無策,只好求助老師了,老師,我這個程式沒錯,但結果不正確 這是在上機課上經常聽到的聲音。初學者缺乏經驗,也缺乏耐心。殊不知每個程式設計師都是在不斷的和錯誤鬥爭的過程中成...

GDB除錯程式的使用

gdb概述 gdb是gnu開源組織發布的乙個強大的unix下的程式除錯工具。或許,各位比較喜歡那種圖形介面方式的,像vc bcb等ide的除錯,但如果你是在unix平台下做軟體,你會發現gdb這個除錯工具有比vc bcb的圖形化偵錯程式更強大的功能。一般來說gdb主要有三大功能 1 啟動被除錯函式 ...