使用工具:vc6.0,ida
當我們要在程式中輸出除錯資訊時,常常以字串的形式來輸出,例如:
1.
printf
(
"some debug information here!\n"
);
1.
#if _debug
2.
printf
(
"some debug information here!\n"
);
3.
#endif
這樣就達到了在debug版裡程式輸出除錯資訊,在release版下不輸出除錯資訊的目的。(在release版裡連printf函式都沒有呼叫)可如果要在程式裡的許多地方輸出除錯資訊,若採用上面的方式會很麻煩;
(至於為什麼麻煩,可能就是不願多敲幾次鍵盤吧,呵呵。。。)
1.
void
printinfo(
char
*strinfo)
2.
注:該函式只是演示用的,很簡單,沒有其他檢查字串功能。
在要輸出除錯資訊的地方,呼叫如下語句就行:
1.
printinfo(
"some debug information here!\n"
);
確實,在debug模式下執行該程式,則輸出如下資訊:
1.
some debug information here!
在release模式下,則沒輸出什麼資訊;
我們往往在這個時候認為一切都ok了;如果你認為是,就沒必要往下看了;呵呵。。。
雖然在release版下執行程式沒有輸出除錯資訊來,可這些除錯資訊卻留在了二進位制的可執行檔案裡;
我們可以用ida來開啟該release版的可執行檔案,看到如圖一所示的資訊:
圖一:ida反彙編後的main函式
注:該函式就是main函式
可見除錯資訊字串(「some debug information here!\n」)確實存在於release版的可執行檔案裡;
我們當然不希望別人看到這些除錯資訊,那有沒有辦法來防止該除錯資訊被編譯進release版的可執行檔案裡呢?
辦法是有的,這裡來描述2個方法。
辦法一:
定義如下巨集:
1.
#if _debug
2.
#define _d(str) str
3.
#else
4.
#define _d(str) null
5.
#endif
此時輸出語句變為:
1.
printinfo(_d(
"some debug information here!\n"
));
在debug模式下執行程式,依然輸出除錯資訊:
1.
「some debug information here!」;
在release下,則什麼都不輸出,此時我們用ida看一下release版的二進位制檔案,則沒有發現該除錯資訊字串。
如圖二示:
圖二:ida反彙編後的main函式
方法二:
定義如下巨集:
1.
#if _debug
2.
void
printinfo(
char
*strinfo)
3.
6.
#else
7.
#define printinfo(str)
8.
#endif
注意:該巨集把函式printinfo的定義也放進去了;
在debug模式下執行程式,也同樣輸出除錯資訊:
1.
「some debug information here!」;
在release下,也什麼都不輸出,此時我們用ida看一下release版的二進位制檔案,也沒有發現該除錯資訊字串。
如圖三示:
圖三:ida反彙編後的main函式
既然方法一和方法二都能實現同樣的功能,那究竟那個方法好呢?
方法一和方法二確實都沒在可執行檔案裡留下除錯資訊,比較一下圖二和圖三,我們不難發現:
圖二當中多了乙個函式呼叫 call nullsub_1,該函式就是printinfo,雖然該函式什麼都不做,但它卻呼叫了,我們一般也不希望該函式呼叫,所以方法一中多了乙個函式呼叫,增加了開銷,而方法二當中卻沒有呼叫該函式。
個人認為方法二較好。
輸出字串
5.連線字串 半形句號 是字串連線符,可以把兩個字串連線成乙個字串。例如7 5 echo str.url 技巧 我們可以使用字串連線符累加字串。例如7 6 第一句我們給 str賦值,str表示字串 php中文社群位址是 第二句表示在 str的值上累加字串 www.phpnet.cn 所以,str最後...
輸出字串Count and Say
最近研究輸出字串,稍微總結一下,以後繼續補充 標題如下 the count and say sequence is the sequence of integers beginning as follows 1,11,21,1211,111221,1is read off as one 1 or11...
倒序輸出字串
public static void main string args system.out.println result public static string revertstring string str char chars str.tochararray int len chars.le...