我們在調試程式時,輸出調試資訊(又稱為”打樁”或者”插樁”)是一種普遍、有效的方法。
我們輸出的資訊通常包括行号、函數名、程式變量等。
但是我們在程式bug修複後,又會特别煩我們之間插入的哪些調試語句,客戶是不會了解我們那些調試語句曾經又多少汗馬功勞,而太多的調試語句也影響我們程式運作時輸出的美觀和清晰,于是很多情況下我們需要手動将那些調試語句注釋掉或者删掉,這對于小項目來說,我們還可以忍受,但是對于大項目,如果我們還是手動删除,我們隻能。。。。呵呵,這不是程式猿該幹的事。。。
下面我們給出幾種調試方式友善大家使用。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
這個程式是有bug的,在程式第40行,變量fac未初始化為1。
插入的調試資訊
在不需要時我們隻能将此調試資訊注釋掉,這個是最原始,最人工的一種方式。
優勢: 友善簡單,易于操作,簡單易讀 缺點: 非常靈活,單一的調試資訊會造成錯誤輸出過于備援
通過預處理指令将調試資訊封閉起來,如下
這樣調試的資訊隻存在與插樁資訊宏debug的預處理指令下,如果需要打開調試資訊就定義插樁資訊宏debug,否則就将插樁資訊宏debug注釋掉(也可以undef或者删掉)。
這樣我們的代碼就變成
41
42
43
44
45
其實我們也可以不在代碼中添加插樁資訊宏debug,gcc為我們提供了一個更簡單的方法,那就是gcc -d編譯選項
是以我們可以直接
①不靈活,單一的調試宏,對于小項目來說可以,但是對于大項目同樣會造成錯誤輸出過于備援,在大項目中,為了增加靈活性,往往通過定義多個等級的debug(如debug1,debug2,debug3等)或者不同名稱的debug(如debug_data,debug_comm,debug_app等),來為不同的子產品,或者錯誤等級進行調試,但是也會引入其他一些更複雜的問題,如項目難以管理,難以整合等問題。 ②每個調試資訊都會被成對的預處理指令包含,造成項目代碼的過度膨脹,延長預處理時間;同時也不利于代碼的閱讀。
(編譯階段)能避免使用宏可能帶來的副作用,而且友善日後定制debug資訊的輸出,特别友善維護和修改。我可以随時修改它,比如列印到網絡伺服器,本地檔案,其他終端等,很友善的重定向。這是我最喜歡使用的方法。
或者
這裡我們依舊使用了插樁調試宏debug,但是在宏定義和未定義的時候,分别定義了不同的debugprintf調試資訊函數。這種方法的本質其實就是重寫了一個我們自己的printf函數,在glibc或者其他c運作庫中,printf就是用vfprintf或者vprintf來實作的。
在定義了插樁調試宏debug時,debugprintf被定義為一個向标準出錯流輸出資訊的輸出函數。但是在未定義插樁調試宏debug時,debugprintf被定義為一個内聯的空函數(當然也可以不使用内聯,但是空函數為增加額外開銷,c語言本身是不支援内聯函數的,在c标準c99中c語言支援了内聯函數)。
其中的空函數體不是很清晰,如果别人看我們代碼的時候,可能會很疑惑為什麼,我們可以加上注釋或者采用如下代碼代替
這樣我們同樣通過插樁調試宏debug的定義與否來實作調試資訊的開啟和關閉。
這樣我們的程式就變為
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
這種方式跟上一種方式有點差別,但是本質上是一樣的,上面我們看到,我們通過插樁調試宏來控制調試函數的不同實作,未定義插樁資訊宏時,調試函數被定義會空函數,但是這種方式有個缺點,就是會造成目标代碼的膨脹。
下面這種方式,我們首先實作一個調試函數,然後通過宏定義來指向
這樣我們的程式變為
前面的兩種方法,我們都是用vfprintf或者vprintf自己重新實作了一個輸出函數,但是我們要想了我們是否可以使用printf函數呢,當然可以了
代碼如下
這種方式其實就是将原來定義的調試資訊宏debug更換未全局變量isdebug
前面的方法,如果進行調試或者取消調試,都需要重新編譯,這樣我們就可以使用調試等級來确定。
我們可以根據調試資訊的細節程度,将調試資訊分成不同的等級。調試資訊的等級必須大于0,若調試資訊細節程度越高,則等級越高。在輸出調試資訊時,若調試等級高于調試資訊等級才輸出調試資訊,否則忽略該調試資訊,如程式5。當調試等級為0時,則不輸出任何調試資訊。
下面我們以通過預處理指令定義調試函數的不同實作為例子,說明以下帶調試等級的插樁調試資訊
66
67
68
69
70
71
轉載:http://blog.csdn.net/gatieme/article/details/45625643