我似乎无法从
clang
获取有关gdb
程序的所有预处理器宏的信息。
考虑这个简单的代码:
#include <stdio.h>
#define MACRO_B 2
int main()
{
printf("MACRO A: %d\n", (int) MACRO_A);
printf("MACRO B: %d\n", (int) MACRO_B);
return 0;
}
我在命令行上定义
MACRO_A
:
clang -ggdb3 -fdebug-macro -DMACRO_A=1 -o test test.c
根据文档,选项
-fdebug-macro
应该足以添加关于MACRO_A
和MACRO_B
的信息,但是使用gdb
我无法访问关于MACRO_A
的信息:
(gdb) info macro MACRO_B
Defined at /data/work/external/developer/SO/debug_preprocessing_macro_clang/test.c:3
#define MACRO_B 2
(gdb) info macro MACRO_A
The symbol `MACRO_A' has no definition as a C/C++ preprocessor macro
at /data/work/external/developer/SO/debug_preprocessing_macro_clang/test.c:7
我正在使用
clang version 12.0.0-3ubuntu1~20.04.5
和 gdb 9.2-0ubuntu1~20.04.1
。
我有什么遗漏的吗?
C 预处理器宏不包含在您的输出程序中。编译程序时,c 预处理器会运行该文件,并用文字文本
1
或 2
替换 MACRO_A
和 MACRO_B
。然后它获取生成的文件并遵守代码。当您向 gdb 询问宏信息时,它不会查找输出文件,而是读取源代码,并在那里找到宏。因为 MACRO_A
不在你的源代码中,所以找不到它。
如果您确实想要 GDB 稍后可以找到的全局值,请考虑使用
static const int MY_GLOBAL_A = MACRO_A
。可以在命令行上给出宏,gdb 应该能够解析 MY_GLOBAL_A
。