2011-06-17 3 views
1

J'utilise gdb pour déboguer du code C++. Au moment où le code que je regarde itère à travers un tableau de pointeurs, qui sont soit un pointeur vers un objet ou un pointeur NULL.affichage conditionnel dans gdb

Si je juste display list[index]->member il va se plaindre lorsque la liste [index] est nulle. Est-il possible d'afficher le membre uniquement si la liste [index] n'est pas null? Je sais que vous pouvez définir des points d'arrêt conditionnels (condition <bp-num> <exp>) mais je ne suis pas sûr de savoir comment cela pourrait aider.

Le code en question est:

for (int i=0;i<BSIZE*BSIZE;i++){ 
    if (vms[i]==target) {valid=true; break;} 
} 

où est le vms tableau de pointeurs.

+0

Got it! Définir un point d'arrêt à la ligne 'if', y accéder, avancer jusqu'à vms [i]! = NULL, définir le point d'arrêt (disons BP1) à 'condition 1 vms [i]! = NULL' et allumer en toute sécurité 'afficher vms [i] -> member', puis continuer à frapper :) :) De meilleures solutions sont les bienvenues! – Samizdis

Répondre

2

Depuis display accepte des expressions arbitraires, vous pouvez essayer quelque chose comme la commande display suivante:

display (list[index]) ? list[index]->member : "null" 

Je ne suis pas sûr si cela nettoie assez bien pour ce que vous voulez - vous aurez toujours un affichage, mais ce ne sera pas une plainte.

+0

Parfait, merci! – Samizdis

0

Fondamentalement, la condition fonctionne comme ceci:

#include <iostream> 

int main() { 
     for (int i=0; i<10; ++i) { 
       std::cerr << i << std::endl; 
     } 
} 

Vous pouvez déboguer comme ceci:

(gdb) break 5 
Breakpoint 1 at 0x100000d0e: file foobar.cpp, line 5. 
(gdb) condition 1 i==3 
(gdb) r 
Starting program: /private/tmp/foobar 
Reading symbols for shared libraries ++. done 
0 
1 
2 

Breakpoint 1, main() at foobar.cpp:5 
5   std::cerr << i << std::endl;