我似乎不能从gdb中获得一个clang程序的所有预处置宏的信息.

考虑下面这段简单的代码:

#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

根据documentation,选项-fdebug-macro应该足以添加关于MACRO_AMACRO_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.5gdb 9.2-0ubuntu1~20.04.1.

我是不是漏掉了什么?

推荐答案

我怀疑这与this GDB bug有关,这与使用Clang时在命令行上定义的宏的处理有关.

这个错误已经在GDB 13和更高版本中修复了,所以我认为答案是更新GDB.

当我使用GDB 14和Clang 15时,我看到以下行为:

(gdb) info macro MACRO_A
Defined at /tmp/clang-macro/test.c:0
-DMACRO_A=1
(gdb) info macro MACRO_B
Defined at /tmp/clang-macro/test.c:3
#define MACRO_B 2

C++相关问答推荐

为什么在C中进行大量的位移位?

将整数的.csv文件解析为C语言中的二维数组

为什么可以在typedef之前使用typedef d struct 体?

有没有可能我不能打印?(C,流程)

从纯C中访问通用项对话框

用C宏替换strncMP函数中的参数

为什么GDB/MI进程的FIFO循环中有read()阻塞

Flose()在Docker容器中抛出段错误

防止C++中递归函数使用堆栈内存

如何在VS 2022中正确安装额外的C头文件

Cairo STM32MP1 cairo_Surface_WRITE_TO_PNG始终返回CAROLIO_STATUS_WRITE_ERROR

C语言中的数字指针

Makefile无法将代码刷新到ATmega328p

C: NULL>;NULL总是false?

访问未对齐联合的成员是否为未定义行为,即使被访问的成员已充分对齐?

%g浮点表示的最大字符串长度是多少?

为什么<到达*时不会转换为>?

比 * 更快的乘法

C simd _m128 晶圆厂

初始化动态分配的布尔二维数组的最佳方法是什么?