2010-09-30 7 views
10

Comment appelez-vous operator<<(std::ostream &os, const ClassX &x) de l'intérieur de gdb? En d'autres termes, comment imprimer un objet dans gdb?appel opérateur << en gdb

call std::cout<<x ou call operator<<(std::cout, x) ne semble pas fonctionner pour moi!

Des idées?

+0

Je tape dans la commande 'print' pour imprimer des variables et des objets. –

+4

Je travaille avec une classe dans laquelle l'opérateur << fait beaucoup pour que l'information soit lisible, donc c'est un peu ennuyeux d'utiliser l'impression et d'avoir des données brutes. – Ben

Répondre

10

La seule façon que j'ai trouvé ceci:

call 'operator<<(std::ostream&, myclass&)'(mycout, c) 

Depuis std::cout n'a pas été visible à gdb pour une raison quelconque, je devais recourir à créer ma propre comme ceci:

std::ostream mycout(std::cout.rdbuf()); 

Vous Vous n'avez pas indiqué de raisons pour vouloir le faire, mais cela ne vous facilitera pas la tâche?

Si cela est ABSOLUMENT vous pourriez avoir une méthode Print dans votre classe et appeler de operator<< puis appeler la méthode Print sur votre objet de gdb. Prenez note que stdout est probablement mis en tampon dans gdb donc vous ne verrez aucune sortie à moins que vous ne le redirigiez d'une manière ou d'une autre.

Voir this discussion de l'archive de courrier de gdb concernant ce problème.

3

Vous pouvez également définir une fonction comme:

define printType 
call operator<<(std::ostream&, const $arg0 &)(std::cerr, $arg1) 
end 

Et l'utiliser comme:

TypeImpression ClassX objectOfClassX

0

Pour moi call operator<< couru sans erreur, mais n'a pas impression. Il s'avère que j'avais besoin d'un appel à flush. Voici une fonction utile que vous pouvez mettre .gdbinit:

define str 
    call (void)operator<<(std::cout, $arg0) 
    call (void)std::cout.flush() 
    printf "\n" 
end