gcc默認編譯的時候,gdb調試過程當中是不能看到宏定義的,"p 宏名" 會顯示錯誤,以下:bash
(gdb) p CLIENT6_BEGIN_FLG No symbol "CLIENT6_BEGIN_FLG" in current context.
這樣gdb調試過程當中就很不直觀,尤爲是不少大型程序的宏定義比較複雜。函數
要使gdb能查看宏定義,gcc編譯的時候要加上-g3和-gdwarf-2兩個選項。debug
gdb的debug一共有4個等級,默認使用第2個等級。調試
----第0個等級表示不使用任何的debug信息,但-g0和-g是不同的code
----第1個等級包含最少的信息,但對於查看堆棧來講已經足夠了,它包含了一些函數描述和外部變量,但不包含局部變量和行號編譯
----第3個等級包含額外的信息,例如宏定義,要使用選項-g3class
-gdwarf-2不能再接受一個緊密鏈接的debug等級,這是由於gcc過去支持一個選項-gdwarf,這個選項要以DWARF的1號版本格式來產生debug信息(這個版本和2號版本是大相徑庭的),若是那麼作就會讓人很困惑。這種debug格式太長了,可是這個選項又不能變,因此改用選項-glevel來爲DWARF改變debug等級。test
加上相關參數後,編譯:變量
gcc -gdwarf-2 -g3 test.c
gdb a.out後就可以使用 "p 宏名" 輸出宏的內容了gcc
(gdb) p CLIENT6_BEGIN_FLG $1 = "<Client6>"
須要查看宏定義是如何被展開的,可使用以下的命令:
macro expand macro_name