En supposant avoir quelque chose comme ça:
#include <map>
int main(){
std::map<int,int> m;
m[1] = 2;
m[2] = 4;
return 0;
}
Je voudrais pouvoir inspecter le contenu de la carte exécutant le programme depuis gdb.
Si j'essaye d'utiliser l'opérateur d'indice, j'obtiens:
(gdb) p m[1]
Attempt to take address of value not located in memory.
L'utilisation de la méthode find ne donne pas de meilleurs résultats:
(gdb) p m.find(1)
Cannot evaluate function -- may be inlined
Y a-t-il un moyen d'accomplir cela?
Les réponses existantes à cette question sont très dépassées. Avec une récente GCC et GDB Works It Just TM grâce au support de Python intégré dans GDB 7.x et libstdc ++ imprimantes jolies qui viennent avec GCC.
Pour l'exemple de l'OP, j'obtiens:
Si cela ne fonctionne pas automatiquement, vous voyez le premier point sur la page Support STL du wiki GDB.
Vous pouvez également écrire de jolies imprimantes Python pour vos propres types, voir Pretty Printing dans le manuel GDB.
la source
Could not find operator[]
.Il y a toujours une évidence: définissez votre propre fonction de test ... Appelez-la depuis gdb. Par exemple:
Et:
la source
le
stl-views.gdb
habitude d'être la meilleure réponse était, mais pas plus.Ce n'est pas encore intégré dans la ligne principale
GDB
, mais voici ce que vous obtenez en utilisant la branche 'archer-tromey-python' :la source
Essayez de dé-référencer les conteneurs STL: sur cette page: http://www.yolinux.com/TUTORIALS/GDB-Commands.html
la source
Les réponses ci-dessus fonctionnent et très bien. Si vous utilisez stl-views.gdb, voici la bonne façon d'afficher les cartes et les éléments qu'il contient. Laissez votre carte est la suivante:
std::map<char, int> myMap;
c'est-
pmap <variable_name> <left_element_type> <right_element_type>
à- dire pour voir les éléments de la carte.J'espère que cela pourra aider.
la source
Vous pouvez contourner le deuxième problème (
Cannot evaluate function -- may be inlined
) en vous assurant que votre compilateur utilise les informations de débogage DWARF-2 (ou 3 ou 4) lorsque vous compilez votre programme. DWARF-2 inclut des informations intégrées, vous devriez donc pouvoir utiliser l'une des méthodes que vous avez décrites pour accéder aux éléments de votrestd::map
conteneur.Pour compiler avec les informations de débogage DWARF-2, ajoutez l'
-gdwarf-2
indicateur à votre commande de compilation.la source