GDB,如何调试宏

ars*_*lan 4 c gdb

我正在调试一个巨大的 c 源代码,它有很多宏定义。当前,宏发生分段错误。我希望能够调试宏,像函数一样进入宏定义。我试过了

    ./configure debugflags="-gdwarf-2 -g3"
    make
Run Code Online (Sandbox Code Playgroud)

但这不起作用,make 失败了。如果没有上述选项,它可以正确编译,但无法调试宏。

那么,我该如何调试宏?提前致谢

unw*_*ind 6

您永远不应该期望能够“步入”宏;从编译器的角度来看宏不存在。在代码的实际编译开始之前,它们会被预处理步骤删除。

您可以尝试生成源代码的预处理版本(这是-EGCC 的选项)并显式编译它们,以便您拥有一个源文件,其中包含在使用位置扩展的每个宏调用,这可以帮助让它更清楚。

这是“经典”且独立于编译器的方法。您的编译器可能会为您提供更多选项,因此请浏览文档。

关于你的例子,debugflags我不认识它,它通常被放入CFLAGS,但也许你的包的做法不同。


Ola*_*che 5

您可以将宏转换为static inline函数,例如从

#define max(a, b) (a) > (b) ? (a) : (b)
Run Code Online (Sandbox Code Playgroud)

到

static inline max(int a, int b)
{
    return a > b ? a : b;
}
Run Code Online (Sandbox Code Playgroud)

这让编译器可以为宏(现在是函数)创建调试信息。