在 clang 中调试预处理器宏

问题描述 投票:0回答:1

我似乎无法从

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 debugging gdb clang
1个回答
0
投票

C 预处理器宏不包含在您的输出程序中。编译程序时,c 预处理器会运行该文件,并用文字文本

1
2
替换
MACRO_A
MACRO_B
。然后它获取生成的文件并遵守代码。当您向 gdb 询问宏信息时,它不会查找输出文件,而是读取源代码,并在那里找到宏。因为
MACRO_A
不在你的源代码中,所以找不到它。

如果您确实想要 GDB 稍后可以找到的全局值,请考虑使用

static const int MY_GLOBAL_A = MACRO_A
。可以在命令行上给出宏,gdb 应该能够解析
MY_GLOBAL_A

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.