当使用clang编译程序时,是否可以在gdb中扩展C宏?
我有一个宏,它取整数的第J位:当使用clang编译程序时,是否可以在gdb中扩展C宏?,c,gdb,clang,c-preprocessor,C,Gdb,Clang,C Preprocessor,我有一个宏,它取整数的第J位: #define TWO_TO_THE(POWER) (1 << POWER) #define JTH_BIT(BITS, J) ((TWO_TO_THE((J-1)) & BITS) != 0) #定义两个(POWER)(1宏由预处理器处理。编译器甚至不知道它们 但是,如果幸运的话,GCC的选项-g3将完成这项工作并生成代码,从而允许gdb展开宏 (我强调): -格雷维尔 [……] 级别3包括额外的信息,例如程序中存在的所有宏定义。某些调
#define TWO_TO_THE(POWER) (1 << POWER)
#define JTH_BIT(BITS, J) ((TWO_TO_THE((J-1)) & BITS) != 0)
#定义两个(POWER)(1宏由预处理器处理。编译器甚至不知道它们
但是,如果幸运的话,GCC的选项-g3
将完成这项工作并生成代码,从而允许gdb
展开宏
(我强调):
-格雷维尔
[……]
级别3包括额外的信息,例如程序中存在的所有宏定义。某些调试器在使用-g3时支持宏扩展
如果你用正确的选项编译你的程序,它应该可以工作。在gcc中,你需要在编译时说“-g3”
请参阅和。但是这个问题是关于调试器的,而不是关于编译器。调试器可以访问二进制文件和源代码(通常),因此任何事情都是可能的。我将makefile更改为使用-g3编译,但当我尝试打印宏的结果时,我得到“GDB没有该代码的预处理器宏信息”,我需要在gdb中加载头文件吗?@TobiLehman:info macro JTH_BIT
告诉您什么?以及:您是否执行了make clean
?@alk我执行了make clean
,然后执行了make
,以及编译时使用的-g3
参数。然后,在调试器中宏位于作用域的行中,执行info macroJTH_位
返回GDB没有该代码的预处理器宏信息。
@TobiLehman:您使用的是哪种gcc,在哪种平台上?您可能应该使用一个简单的(2行程序)来测试这一点例如,如果您使用的gcc版本在使用了-g3
后确实支持宏扩展,则应重新打开此文件,因为这是一个关于clang
的问题,而假定的副本是关于gcc
。我怀疑当op明显使用clang时,这是否有用。