Les symboles de macro gdb ne sont pas présents même lorsque vous utilisez -g3 ou -ggdb3 ou -gdwarf-4

J’ai ce fichier C (exemple.c):

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

que je comstack avec:

 $ gcc -O0 -Wall -g3 sample.c -o sample 

puis déboguer avec

 $ 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  This is free software: you are free to change and redissortingbute 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: ... 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 

Cela fonctionnait. J’ai besoin que cela fonctionne car j’utilise des bibliothèques qui définissent des noms pour les périphériques matériels et les adresses mémoire.

Cela semble être en contradiction directe avec le comportement indiqué sur le site Sourceware gdb .

Qu’est-ce que je fais mal?

On dirait que les macros doivent être “intégrées” d’une manière ou d’une autre. Si vous suivez exactement les exemples de la page vers laquelle vous créez un lien, ils fonctionnent comme annoncé (du moins, ils le font pour moi).

Exemple ( tc est votre fichier source):

 $ gcc -O0 -g3 tc $ 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 :-1 // Macros not loaded yet (gdb) list main 1 #include  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/tc: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) 

Ou:

 $ 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 tc, line 6. (gdb) r Starting program: /home/foo/tmp/a.out Breakpoint 1, main () at tc:6 6 printf("%d\n", M); (gdb) macro expand ADD(1) expands to: (42 + 1) // Macros loaded (gdb) 

Essayez de faire une list abord:

 (gdb) list 1 #include  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) 

J’ai eu le problème avec l’échantillon et j’ai réalisé que j’utilisais une ancienne version de gcc.

Auparavant, j’utilisais gcc 3.46 et gdb 7.3, l’expansion des macros ne fonctionnait pas, la mise à niveau de gcc vers la version 4.5.2 et gdb vers la version 7.5 réglaient le problème.

gdb fonctionne sur un exécutable où toutes vos macros sont remplacées au moment du prétraitement, de sorte que M n’est pas présent dans le contexte