Skip to content

debug c/cpp macro

在 c 和 cpp 开发中,不可避免的会用到宏,从而产生了宏调试时的问题。宏的本质是预处理时候的文本的单行替换,就因为这样的特性导致宏中不能打断点。即是是在宏展开的所在行打上断点,也不能知道代码真正执行到了哪个部分。因此在此总结一些宏调试过程中的技巧。

查看预处理结果

在 gcc 编译源文件的时候,可以直接加上 -E 参数,让 gcc 只进行预处理而不进行后续的编译操作。对于一个较为简单的文件,可以使用这个命令看看整个文件上下文中宏展开的结果。

使用 gdb 帮助调试

因为不能打断点的原因, gdb 在宏调试上的威力有所减弱。但是仍有 gdb 命令能够帮助宏调试。

macro expand

这是 gdb 中最常见的宏调试命令,用来展开一个宏。通过 macro expand MACRO,用户输入的 MACRO 表达式能够被展开并打印到控制台上。与之相似的还有命令 macro expand-once 这个命令表示只进行深度为 1 层的展开。

info macro

通过 info macro -- MACRO 命令,可以了解到当前文件上下文中用户指定的宏定义的信息。

打断点到函数上

宏中可能会执行一些函数,把断点打在函数上,就能够调试宏中的函数,保证宏中函数执行的正确性。

直接print

没别的办法了,只能 print 了,最简单的方式。