VC中用于調試程序的幾個宏的使用技巧

一、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 )

{

ASSERT( p != 0 ); //確認緩沖區的指針是有效的

ASSERT( ( size >= 100 ); //確認緩沖區至少有100個字節

// Do the foo calculation

}

這些語句不産生任何代碼,除非—DEBUG處理器標志被設置。Visual C++只在Debug版本設置這些標志,而在Release版本不定義這些標志。當—DEBUG被定義時,兩個assertions將産生如下代碼:

//ASSERT( p != 0 );

do{

if( !(p != 0) && AfxAssertFailedLine(—FILE—,—LINE—) )

AfxDebugBreak();

}while(0);

//ASSERT((size 〉= 100);

do{

if(!(size 〉= 100) &&AfxAssertFailedLine(—FILE—,—LINE—))

AfxDebugBreak();

}while(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 )

{

char q;

VERIFY(q = p);

ASSERT((size 〉= 100);

// Do the foo calculation

// Do the foo calculation

}

在Debug模式下,ASSERT和VERIFY是一回事,但是在Release模式下,VERIFY宏仍然測試表達式而assertion卻不起任何作用。可以說,在Release模式下,ASSERT語句被刪除了。

請注意,如果你在一個ASSERT語句中錯誤地使用了一個能動的表達式,編譯器將不做任何警告地忽略它。在Release模式下,該表達式就會被無聲息地刪除掉,這將會導致程序的錯誤運行。由于Release版的程序通常不包含Debug信息,這類錯誤將很難被發現。

VC中用于調試程序的幾個宏的使用技巧
一、TRACE宏  當選擇了Debug目標,並且afxTraceEnabled變量被置爲TRUE時,TRACE宏也就隨之被激活了。但在程序的Release版本中,它們是被完全禁止的。下面是一個典型的TRACE語句: … int nCount =9; ...查看完整版>>VC中用于調試程序的幾個宏的使用技巧
 
VC中用于調試程序的幾個宏的使用技巧
一、TRACE宏  當選擇了Debug目標,並且afxTraceEnabled變量被置爲TRUE時,TRACE宏也就隨之被激活了。但在程序的Release版本中,它們是被完全禁止的。下面是一個典型的TRACE語句: … int nCount =9; ...查看完整版>>VC中用于調試程序的幾個宏的使用技巧
 
VC中用于調試程序的幾個宏的使用技巧
一、TRACE宏  當選擇了Debug目標,並且afxTraceEnabled變量被置爲TRUE時,TRACE宏也就隨之被激活了。但在程序的Release版本中,它們是被完全禁止的。下面是一個典型的TRACE語句: … int nCount =9; ...查看完整版>>VC中用于調試程序的幾個宏的使用技巧
 
VC中用于調試程序的幾個宏的使用技巧
一、TRACE宏  當選擇了Debug目標,並且afxTraceEnabled變量被置爲TRUE時,TRACE宏也就隨之被激活了。但在程序的Release版本中,它們是被完全禁止的。下面是一個典型的TRACE語句: … int nCount =...查看完整版>>VC中用于調試程序的幾個宏的使用技巧
 
VC使用CRT調試功能來檢測內存泄漏
C/C++ 編程語言的最強大功能之一便是其動態分配和釋放內存,但是中國有句古話:“最大的長處也可能成爲最大的弱點”,那麽 C/C++ 應用程序正好印證了這句話。在 C/C++ 應用程序開發過程中,動態分配的內存...查看完整版>>VC使用CRT調試功能來檢測內存泄漏
 
PHP程序員的優化調試技術和技巧
  本文介紹調試 PHP 應用程序的各種方法,包括在 Apache and PHP 中打開錯誤報告,以及通過在一個簡單的 PHP 腳本中放置策略性的 print 語句,找到更困難的 bug 的源頭。還會介紹用于 Eclipse 的 PHPEclipse 插件,...查看完整版>>PHP程序員的優化調試技術和技巧
 
VC小技巧(3)---右鍵菜單的使用
平時經常會看到一些軟件把一些常用的功能集成在右鍵菜單中,這樣能夠是菜單靈活,易用!以下函數完成了彈出式菜單的創建,只要在右鍵點擊的消息響應中調用就能完成想要的右鍵菜單的功能!void PopupMenu(){ CPoin...查看完整版>>VC小技巧(3)---右鍵菜單的使用
 
VC Studio 使用技巧大全(菜鳥必看)
VC Studio 使用技巧大全 沒辦法呀!,我網上東抓一條西抓一條,看起來真累,所以今天進行整理出來與大家分享! .1.檢測程序中的括號是否匹配 把光標移動到需要檢測的括號(如大括號{}、方括號[]、圓括號()和尖括...查看完整版>>VC Studio 使用技巧大全(菜鳥必看)
 
使用路由器檢測網絡流量的幾個技巧-應用技巧
  一、ip accounting  1、配置方法  router(config)#int s 0/0  router(config-if)#ip accounting output-packets  router#sh ip accounting output-packets  Source Destination Packets Bytes  192....查看完整版>>使用路由器檢測網絡流量的幾個技巧-應用技巧
 
 
回到王朝網路移動版首頁