Debug 輸出字串 除錯資訊

2021-06-09 00:10:44 字數 3056 閱讀 8361

使用工具: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.voidprintinfo(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.voidprintinfo(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...