TRACE宏對于VC下程序調(diào)試來說是很有用的東西,有著類似printf的功能,;該宏僅僅在程序的DEBUG版本中出現(xiàn),,當RELEASE的時候該宏就完全消息了,從而幫助你調(diào)式也在RELEASE的時候減少代碼量,。
使用非常簡單,,格式如下:
TRACE("DDDDDDDDDDD");
TRACE("wewe%d",333);
同樣還存在TRACE0,TRACE1,,TRACE2,。。,。分別對應0,,1,2,。,。個參數(shù)
TRACE信息輸出到VC IDE環(huán)境的輸出窗口(該窗口是你編譯項目出錯提示的哪個窗口),但僅限于你在VC中運行你的DEBUG版本的程序,。
TRACE信息還可以使用DEBUGVIEW來捕獲到,。這種情況下,你不能在VC的IDE環(huán)境中運行你的程序,,而將BUILD好的DEBUG版本的程序單獨運行,,這個時候可以在DEBUGVIEW的窗口看到DEBUGVIE格式的輸出了。
------------------第二種方法------------------------------
OutputDebugString is a API function, it is used to help programmer debug the program, which is like
TRACE or afxDump, it is work with Dbgview. in Debug mode it performance as TRACE. But in Release mode it can be monitor in DbgView. OutputDebugString is explained in MSDN The OutputDebugString function sends a string to the debugger for the current application.
VOID OutputDebugString(
LPCTSTR lpOutputString // pointer to string to be displayed ); Parameters: lpOutputString parameters Pointer to the null-terminated string to be displayed.
Return Values
This function does not return a value. Remarks
If the application has no debugger, the system debugger displays the string. If the application has no debugger and the system debugger is not active, OutputDebugString does nothing. Example: void CSdfghfgView::OnRButtonDown(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default OutputDebugString("right button is pressed"); } 參數(shù)就是你需要輸出的字符串了,。如果你需要顯示數(shù)字等,,你需要事先格式化字符串。注意WINDOWS CE僅僅支持UNICODE版本,,所以你提供的字符串應該轉換為UNICODE,。使用_tstrcat等來格式化字符串。
如果你的應用程序有一個DEBUGER,那么該函數(shù)輸出到DEBUGER,,否則就輸出到系統(tǒng)的DEBUGER,,如果兩個都沒有,該函數(shù)什么也不做,。
注意,,輸出到系統(tǒng)DEBUGER的,你可以使用DEBUGVIEW工具查看日志,,這樣你在程序運行的時候也可以看到日志了,。很多程序都使用這種方式來寫日志,包括MICROSOFT本身也使用這種方法,。
------------------第三種輸出方法------------------------------------
當我們要在程序中輸出調(diào)試信息時,,常常以字符串的形式來輸出,例如:
printf("Some debug information here!\n");這段代碼在Debug和Release版下都輸出調(diào)試信息,,這不是我們所要的,,一般地大家都會添加
預編譯指令,如下所示: #if _DEBUG
printf("Some debug information here!\n");
#endif
這樣就達到了在Debug版里程序輸出調(diào)試信息,,在Release版下不輸出調(diào)試信息的目的,。(在Release版里
連printf函數(shù)都沒有調(diào)用)可如果要在程序里的許多地方輸出調(diào)試信息,若采用上面的方式會很麻煩,; (至于為什么麻煩,,可能就是不愿多敲幾次鍵盤吧,呵呵,。。,。) 于是大家都想到寫個輸出函數(shù),,代碼如下:
void printInfo(char *strInfo) { #if _DEBUG printf(strInfo); #endif }注:該函數(shù)只是演示用的,很簡單,,沒有其他檢查字符串功能,。
在要輸出調(diào)試信息的地方,調(diào)用如下語句就行:
printInfo("Some debug information here!\n"); 確實,,在Debug模式下運行該程序,,則輸出如下信息: Some debug information here!在Release模式下,則沒輸出什么信息,; 我們往往在這個時候認為一切都OK了,;如果你認為是,就沒必要往下看了,;呵呵,。。。
雖然在Release版下運行程序沒有輸出調(diào)試信息來,,可這些調(diào)試信息卻留在了二進制的可執(zhí)行文件里,;
我們可以用IDA來打開該Release版的可執(zhí)行文件,看到如圖一所示的信息: 圖一:IDA反匯編后的main函數(shù) 注:該函數(shù)就是main函數(shù) 可見調(diào)試信息字符串(“Some debug information here!\n”)確實存在于Release版的可執(zhí)行文件里,;
我們當然不希望別人看到這些調(diào)試信息,,那有沒有辦法來防止該調(diào)試信息被編譯進Release版的可執(zhí)行文件里呢? 辦法是有的,,這里來描述2個方法,。 辦法一:
定義如下宏: #if _DEBUG
#define _D(str) str
#else
#define _D(str) NULL
#endif
此時輸出語句變?yōu)椋?
printInfo(_D("Some debug information here!\n")); 在Debug模式下運行程序,依然輸出調(diào)試信息: “Some debug information here!”,;在Release下,,則什么都不輸出,此時我們用IDA看一下Release版的二進制文件,,則沒有發(fā)現(xiàn)該調(diào)試信息字符串,。 如圖二示: 圖二:IDA反匯編后的main函數(shù) 方法二:
定義如下宏: #if _DEBUG void printInfo(char *strInfo) { printf(strInfo); } #else #define printInfo(str) #endif注意:該宏把函數(shù)printInfo的定義也放進去了; 在Debug模式下運行程序,,也同樣輸出調(diào)試信息: “Some debug information here!”,;在Release下,也什么都不輸出,,此時我們用IDA看一下Release版的二進制文件,,也沒有發(fā)現(xiàn)該調(diào)試信息字符串。 如圖三示:
圖三:IDA反匯編后的main函數(shù) 既然方法一和方法二都能實現(xiàn)同樣的功能,,那究竟那個方法好呢,?
方法一和方法二確實都沒在可執(zhí)行文件里留下調(diào)試信息,比較一下圖二和圖三,,我們不難發(fā)現(xiàn):
圖二當中多了一個函數(shù)調(diào)用 call nullsub_1,,該函數(shù)就是printInfo,雖然該函數(shù)什么都不做,, 但它卻調(diào)用了,,我們一般也不希望該函數(shù)調(diào)用,所以方法一中多了一個函數(shù)調(diào)用,,增加了開銷,, 而方法二當中卻沒有調(diào)用該函數(shù)。 下面是程序源代碼:
// 程序目的:
// 測試調(diào)試時輸出的字符串信息 #include <stdio.h>
//#define Method
#ifdef Method //方法一
void printInfo(char *strInfo) { #if _DEBUG printf(strInfo); #endif } #if _DEBUG
#define _D(str) str #else #define _D(str) NULL #endif int main() { printInfo(_D("Some debug information here!\n")); return 0; } #else
//方法二
#if _DEBUG void printInfo(char *strInfo) { printf(strInfo); } #else #define printInfo(str) #endif int main()
{ printInfo("Some debug information here!\n"); return 0; } #endif
本文來自CSDN博客,,轉載請標明出處:http://blog.csdn.net/cyrx2003/archive/2008/04/01/2237183.aspx
|
|