Question

Supposons avoir quelque chose comme ceci:

#include <map>
int main(){
    std::map<int,int> m;
    m[1] = 2;
    m[2] = 4;
    return 0;
}

J'aimerais pouvoir inspecter le contenu de la carte qui exécute le programme à partir de gdb.
Si j'essaie d'utiliser l'opérateur en indice, je reçois:

(gdb) p m[1]
Attempt to take address of value not located in memory.

L'utilisation de la méthode de recherche 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?

Était-ce utile?

La solution

Je pense qu'il n'y en a pas, du moins si votre source est optimisée, etc. Cependant, il existe des macros pour gdb qui peuvent inspecter les conteneurs STL à votre place:

http://sourceware.org/ml/gdb/2008-02/ msg00064.html

Cependant, je ne l'utilise pas, donc YMMV

Autres conseils

Les réponses existantes à cette question sont très obsolètes. Avec une récente GCC et GDB, cela fonctionne TM grâce au support Python intégré à GDB 7.x et aux jolies imprimantes libstdc ++ fournies avec GCC.

Pour l'exemple du PO, je reçois:

(gdb) print m
$1 = std::map with 2 elements = {[1] = 2, [2] = 4}

Si cela ne fonctionne pas automatiquement pour vous, voyez la première puce du assistance STL . page du wiki GDB.

Vous pouvez également écrire de jolies imprimantes Python pour vos propres types, voir Pretty Printing dans le manuel GDB.

Il y a toujours une évidence: définissez votre propre fonction de test ... Appelez-la depuis gdb. Exemple:

#define SHOW(X) cout << # X " = " << (X) << endl

void testPrint( map<int,int> & m, int i )
{
  SHOW( m[i] );
  SHOW( m.find(i)->first );
}

int
main()
{
    std::map<int,int> m;
    m[1] = 2;
    m[2] = 4;
    return 0;  // Line 15.
}

Et:

....
Breakpoint 1 at 0x400e08: file foo.C, line 15.
(gdb) run
Starting program: /tmp/z/qD 

Breakpoint 1, main () at qD.C:15
(gdb) call testPrint( m, 2)
m[i] = 4
(*m.find(i)).first = 2
(gdb) 

Le stl-views.gdb était autrefois la meilleure réponse, mais plus maintenant.

Ceci n'est pas encore intégré à la chaîne principale GDB, mais voici ce que vous obtenez en utilisant le 'archer-tromey-python' branche :

(gdb) list
1   #include <map>
2   int main(){
3       std::map<int,int> m;
4       m[1] = 2;
5       m[2] = 4;
6       return 0;
7   }
(gdb) break 6
Breakpoint 1 at 0x8048274: file map.cc, line 6.
(gdb) run

Breakpoint 1, main () at map.cc:6
6       return 0;
(gdb) print m
$1 = std::map with 2 elements = {
  [1] = 2,
  [2] = 4
}
(gdb) quit

Essayez de supprimer le référencement des conteneurs STL: sur cette page: http: //www.yolinux .com / TUTORIALS / GDB-Commands.html

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) lors de la compilation de votre programme. DWARF-2 inclut des informations en ligne, vous devriez donc pouvoir utiliser l'une des méthodes que vous avez décrites pour accéder aux éléments de votre std::map conteneur.

Pour compiler avec les informations de débogage DWARF-2, ajoutez l'indicateur -gdwarf-2 à votre commande de compilation.

Les réponses ci-dessus fonctionnent et bien. Si vous utilisez stl-views.gdb, voici la manière appropriée de visualiser les cartes et les éléments qu’elle contient. Laissez votre carte est comme suit:     std::map<char, int> myMap;

(gdb) pmap myMap char int

i.e. pmap <variable_name> <left_element_type> <right_element_type> pour voir les éléments sur la carte.

L’espoir que cela aide.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top