我正在调试一个巨大的C源代码,它有许多宏定义。目前有一个分段故障发生在一个宏。我希望能够调试宏,在宏定义步骤就像一个函数。我试过了
./configure debugflags="-gdwarf-2 -g3" make
但这不起作用,make失败。没有上面的选项,它可以正确编译,但无法调试宏。如何调试宏?
wkyowqbh1#
您可以将宏转换为static inline函数,例如从
static inline
#define max(a, b) (a) > (b) ? (a) : (b)
到
static inline max(int a, int b) { return a > b ? a : b; }
这使编译器可以为宏(现在是函数)创建调试信息。
jvlzgdj92#
你永远不应该期望能够“步入”一个宏;从编译器的Angular 来看,宏是不存在的。在代码的实际编译开始之前,它们被预处理步骤删除了。您可以尝试生成源代码的预处理版本(这是GCC的-E选项)并显式编译它们,这样您就有了一个源文件,其中包含每个宏调用的扩展,这有助于使其更清晰。这是一种“经典”的独立于编译器的方法。编译器可能会给予你更多的选择,所以请阅读文档。关于你的例子,debugflags不是我认识的东西,它通常放在CFLAGS中,但也许你的包做得不一样。
-E
debugflags
CFLAGS
2条答案
按热度按时间wkyowqbh1#
您可以将宏转换为
static inline
函数,例如从到
这使编译器可以为宏(现在是函数)创建调试信息。
jvlzgdj92#
你永远不应该期望能够“步入”一个宏;从编译器的Angular 来看,宏是不存在的。在代码的实际编译开始之前,它们被预处理步骤删除了。
您可以尝试生成源代码的预处理版本(这是GCC的
-E
选项)并显式编译它们,这样您就有了一个源文件,其中包含每个宏调用的扩展,这有助于使其更清晰。这是一种“经典”的独立于编译器的方法。编译器可能会给予你更多的选择,所以请阅读文档。
关于你的例子,
debugflags
不是我认识的东西,它通常放在CFLAGS
中,但也许你的包做得不一样。