我有这个C文件(sample.c):

#include <stdio.h>
#define M 42
#define ADD(x) (M + x)
int main ()
{
  printf("%d\n", M);
  printf("%d\n", ADD(2));
  return 0;
}

我用它编译:
$ gcc -O0 -Wall -g3 sample.c -o sample

然后用调试
$ gdb ./sample
GNU gdb (Gentoo 7.3.1 p2) 7.3.1
Copyright (C) 2011 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-pc-linux-gnu".
For bug reporting instructions, please see:
<http://bugs.gentoo.org/>...
Reading symbols from /tmp/sample...done.
(gdb) macro list
(gdb) macro expand ADD(2)
expands to: ADD(2)
(gdb) print M
No symbol "M" in current context.
(gdb) q

这以前很管用。我需要这个来工作,因为我使用的库定义了硬件外设和内存地址的名称。
这似乎与Sourceware gdb site上显示的行为直接矛盾。
我做错什么了?

最佳答案

看来宏需要以某种方式“引入作用域”。如果您完全按照链接页面中的示例操作,它们将按广告的方式工作(至少对我来说是这样)。
示例(t.c是您的源文件):

$ gcc -O0 -g3 t.c
$ gdb ./a.out
GNU gdb (Gentoo 7.3.1 p2) 7.3.1
...
Reading symbols from .../a.out...done.
(gdb) info macro ADD
The symbol `ADD' has no definition as a C/C++ preprocessor macro
at <user-defined>:-1
             // Macros not loaded yet
(gdb) list main
1   #include <stdio.h>
2   #define M 42
3   #define ADD(x) (M + x)
4   int main ()
5   {
6     printf("%d\n", M);
7     printf("%d\n", ADD(2));
8     return 0;
9   }
(gdb) info macro ADD
Defined at /home/foo/tmp/t.c:3
#define ADD(x) (M + x)
             // Macros "in scope"/loaded
(gdb) macro expand ADD(42)
expands to: (42 + 42)
(gdb) macro expand M
expands to: 42
(gdb) macro expand ADD(M)
expands to: (42 + 42)
(gdb)

或:
$ gdb ./a.out
GNU gdb (Gentoo 7.3.1 p2) 7.3.1
...
Reading symbols from .../a.out...done.
(gdb) macro expand ADD(1)
expands to: ADD(1)
             // Macros not available yet
(gdb) break main
Breakpoint 1 at 0x400538: file t.c, line 6.
(gdb) r
Starting program: /home/foo/tmp/a.out
Breakpoint 1, main () at t.c:6
6     printf("%d\n", M);
(gdb) macro expand ADD(1)
expands to: (42 + 1)
             // Macros loaded
(gdb)

关于c - 即使使用-g3或-ggdb3或-gdwarf-4,gdb宏符号也不存在,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10496195/

10-12 16:05