2012-05-08 67 views
4

當宏符號甚至不呈現我有這個C文件(sample.c文件):GDB使用-g3或-ggdb3或-gdwarf -4-

#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 site上顯示的行爲有直接的衝突。

我在做什麼錯?

+0

你的GCC版本是什麼?適用於Ubuntu 14.04上的GCC 4.8 GDB 7.7.1。相關:http://stackoverflow.com/questions/2934006/how-do-i-print-a-defined-constant-in-gdb –

回答

9

看起來像宏需要被「拿來範圍內」這樣或那樣的。如果您完全按照您鏈接到的頁面中的示例進行操作,則它們將按照廣告方式工作(至少它們適合我)。

例(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) 
+1

除非我使用gdb 7.4,否則不會在您的示例中顯示出行爲。我認爲這是因爲一些gcc 4.8(主實驗)必須改變調試符號如何存儲的方式,舊gdb無法識別。所以基本上,我需要確保如果我使用了一個流血的編譯器,我應該使用一個流血的調試器。謝謝。 – hazelnusse

1

嘗試做一個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) 
+0

這並沒有解決它對我來說。基本上我認爲我的問題是使用新的gcc與舊的gdb。不過謝謝。 – hazelnusse

0

gdb的工作在執行您的所有宏是在預處理時間只更換所以M是不存在的情況下

+1

我已經編譯完全一樣的方式,並且能夠保留#defined'd宏和常量。 Sourceware gdb網站甚至將此行爲記錄爲可用,如果您提供-g3或-ggdb3。所以有一些錯誤。 – hazelnusse

+0

@hazelnusse謝謝,我不知道 – Pawan

+0

@Pawan,也許你想刪除這個答案,因爲這不適用於GDB,它可能會讓讀者感到困惑。 –

1

我得到了示例問題,並意識到我使用的是舊版本的gcc。

以前我用過gcc 3.46和gdb 7.3,宏擴展不行,把gcc升級到4.5.2和gdb到7.5解決了這個問題。