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

これは以前は機能していました。ハードウェア周辺機器とメモリアドレスの名前を定義するライブラリを使用しているため、これが機能する必要があります。

これは、 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 に答える