gcc默认编译的时候,gdb调试过程中是不能看到宏定义的,"p 宏名" 会显示错误,如下:
(gdb) p CLIENT6_BEGIN_FLG
No symbol "CLIENT6_BEGIN_FLG" in current context.
这样gdb调试过程中就很不直观,尤其是很多大型程序的宏定义比较复杂。
要使gdb能查看宏定义,gcc编译的时候要加上-g3和-gdwarf-2两个选项。
gdb的debug一共有4个等级,默认使用第2个等级。
----第0个等级表示不使用任何的debug信息,但-g0和-g是不一样的
----第1个等级包含最少的信息,但对于查看堆栈来说已经足够了,它包含了一些函数描述和外部变量,但不包含局部变量和行号
----第3个等级包含额外的信息,例如宏定义,要使用选项-g3
-gdwarf-2不能再接受一个紧密连接的debug等级,这是因为gcc过去支持一个选项-gdwarf,这个选项要以DWARF的1号版本格式来产生debug信息(这个版本和2号版本是截然不同的),如果那么做就会让人很困惑。这种debug格式太长了,但是这个选项又不能变,所以改用选项-glevel来为DWARF改变debug等级。
加上相关参数后,编译:
gcc -gdwarf-2 -g3 test.c
gdb a.out后就能够使用 "p 宏名" 输出宏的内容了
(gdb) p CLIENT6_BEGIN_FLG
$1 = "<Client6>"
需要查看宏定义是如何被展开的,可以使用如下的命令:
macro expand macro_name