【问题标题】:The symbol `M' has no definition as a C/C++ preprocessor macro [duplicate]符号“M”没有定义为 C/C++ 预处理器宏 [重复]
【发布时间】:2016-06-03 11:05:45
【问题描述】:

为什么 GDB 在以下示例中不打印宏的值?

❯ cat sample.c
#include <stdio.h>

#define M 42

int main(int argc, const char **argv)
{
  printf("M: %d\n", M);
  return 0;
}

❯ rm -f sample
❯ gcc -Wall -g3 -ggdb -gdwarf-2 sample.c -o sample
❯ gdb sample

gdb> break main
gdb> run
gdb> info macro M
  The symbol `M' has no definition as a C/C++ preprocessor macro
  at <user-defined>:-1
gdb> continue
  Continuing.
  M: 42

谢谢!

❯ gcc --version
Apple LLVM version 7.3.0 (clang-703.0.29)
❯ gdb --version
GNU gdb (GDB) 7.10.1

【问题讨论】:

  • 只是问一下,如果你删除-O2 有什么不同吗?
  • @SouravGhosh 没有效果 =(
  • c 中应该是int main(int argc, char **argv) argv 是可修改的,所以没有const
  • @iharob 谢谢,但仍然没有效果 =/
  • 您是否尝试过使用其他编译器?如果 gdb 不能打印宏的信息,那是因为你的编译器没有在 DWARF 中添加关于它的信息。您可以使用命令readelf --debug-dump=macro sample 来检查您的 ELF 中有哪些宏信息。

标签: c gcc gdb clang


【解决方案1】:

我使用 GCC 4.4.7 和 GDB 7.2 得到的结果与您报告的不同。使用您的源代码和编译命令后,我的 GDB 会话如下所示:

> gdb sample

[ ... startup banner ... ]

(gdb) break main
Breakpoint 1 at 0x4004d3: file sample.c, line 7.
(gdb) run
Starting program: /home/jbolling/tmp/sample 

Breakpoint 1, main (argc=1, argv=0x7fffffffcba8) at sample.c:7
7     printf("M: %d\n", M);
Missing separate debuginfos, use: debuginfo-install glibc-2.12-1.166.el6_7.7.x86_64
(gdb) info macro M
Defined at /home/jbolling/tmp/sample.c:3
#define M 42
(gdb) continue
Continuing.
M: 42

Program exited normally.
(gdb) 

我怀疑这里的关键区别以及您没有看到M 的定义的原因在于GDB 对与函数main 处的断点关联的源位置的意义。您报告的 GDB 输出提供了一个线索:

gdb> info macro M
  The symbol `M' has no definition as a C/C++ preprocessor macro
  at <user-defined>:-1

特别注意 GDB 报告的位置:“”文件,行号 -1。在我的 GDB 运行中,断点与 main() 正文中的第一个源代码行相关联。我倾向于相信,如果您在此处中断,那么 GDB 将正确报告该位置的宏定义。

【讨论】:

    猜你喜欢
    • 2019-05-13
    • 1970-01-01
    • 2011-01-26
    • 2010-10-17
    • 2011-03-26
    • 1970-01-01
    • 1970-01-01
    • 2020-02-09
    相关资源
    最近更新 更多