9

我有这个 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

这曾经奏效。我需要它来工作,因为我正在使用为硬件外围设备和内存地址提供#define 名称的库。

这似乎与Sourceware gdb 站点上显示的行为直接矛盾。

我究竟做错了什么?

4

4 回答 4

13

看起来宏需要以一种或另一种方式“引入范围”。如果您完全按照链接到的页面中的示例进行操作,它们就会像宣传的那样工作(至少它们对我有用)。

示例(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) 
于 2012-05-08T09:55:29.773 回答
2

尝试做list第一个:

(gdb) list
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       }
10
(gdb) info macro M
Defined at /home/ouah/tst.c:2
#define M 42
(gdb) info macro ADD
Defined at /home/ouah/tst.c:3
#define ADD(x) (M + x)
(gdb)
于 2012-05-08T09:55:15.527 回答
0

我遇到了示例问题,并意识到我使用的是旧版本的 gcc。

之前我用过 gcc 3.46 和 gdb 7.3,宏扩展不起作用,将 gcc 升级到 4.5.2 和 gdb 到 7.5 解决了这个问题。

于 2012-12-25T07:19:06.387 回答
-1

gdb 适用于可执行文件,其中您的所有宏仅在预处理时被替换,因此 M 不存在于上下文中

于 2012-05-08T10:07:47.877 回答