2008-12-31 9 views
0

Lorsque vous naviguez sur les différents commutateurs d'option pour mon compilateur (GNU C++ 3.2.3 est pris en charge par mon organisation pour ma configuration matérielle donnée), je suis tombé sur ceci:« Level » compilateur GNU débogage

-glevel 
    : 
Level 3 includes extra information, such as all the macro definitions 
present in the program. Some debuggers support macro expansion when 
you use -g3. 

Je compilé un programme de test avec quelques macros (comme une boucle, un if-then-else sur un argument), puis essayé le débogueur commercial TotalView, et GDB sur le code compilé -g3. Je n'ai vu aucune différence (les macros n'ont pas été étendues à leur code d'origine, je ne pouvais pas «entrer dans» les macros, etc.). Quelqu'un avait-il l'expérience d'obtenir des fonctionnalités supplémentaires de débogage en utilisant -g3 sur les compilateurs GNU?

Répondre

3

Votre question semble indiquer que vous ne comprenez pas ce que sont les macros. Bien sûr vous ne pouvez pas entrer dans une macro.

Le -g3 est très utile pour les programmes "macro lourds". Considérez:

int main() 
{ 
    int i; 
    for (i = 0; i < 20; ++i) { 
#define A(x) case x: printf(#x "\n"); break 
    switch(i) { 
     A(1); A(2); A(3); A(4); /* line 7 */ 
#undef A 
#define A(x) case 10+x: printf("10+" #x "\n"); break 
     A(1); A(2); /* line 10 */ 
    } 
    } 
    return 0; 
} 

Sans -g3, lorsque vous êtes arrêté sur la ligne 7 ou 10, vous pouvez avoir à chercher beaucoup pour la définition de A(), et il pourrait y avoir beaucoup de ces définitions, donc alors vous avoir à déterminer lequel est "courant".

Avec -g3, GDB peut faire le levage lourd pour vous:

(gdb) b 7 
Breakpoint 1 at 0x4004cc: file m.c, line 7. 
(gdb) b 10 
Breakpoint 2 at 0x4004fc: file m.c, line 10. 
(gdb) r 

Breakpoint 1, main() at m.c:7 
7   A(1); A(2); A(3); A(4); 
(gdb) info macro A 
Defined at /tmp/m.c:5 
#define A(x) case x: printf(#x "\n"); break 
(gdb) c 
1 
2 
3 
4 

Breakpoint 2, main() at m.c:10 
10  A(1); A(2); 
(gdb) info macro A 
Defined at /tmp/m.c:9 
#define A(x) case 10+x: printf("10+" #x "\n"); break 
(gdb) q 
+0

I * ne * comprendre que vous ne pouvez pas entrer dans une macro. C'était ma tentative de comprendre l'explication faible du manuel que "Certains débogueurs supportent la macro expansion" pour -g3. De toute façon, merci, votre explication montre ce que je peux * vraiment * faire avec -g3! Vous gagnez le cookie de réponse accepté! –

2

J'ai essayé -g3 par intermittence depuis 1992 et je jamais eu à faire quoi que ce soit utile.