Domanda

Supponendo di avere qualcosa del genere:

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

Vorrei essere in grado di ispezionare il contenuto della mappa che esegue il programma da gdb.
Se provo ad usare l'operatore di sottoscrizione ottengo:

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

L'uso del metodo find non produce risultati migliori:

(gdb) p m.find(1)
Cannot evaluate function -- may be inlined

C'è un modo per raggiungere questo obiettivo?

È stato utile?

Soluzione

Penso di no, almeno non se la tua fonte è ottimizzata ecc. Tuttavia, ci sono alcune macro per gdb che possono ispezionare i contenitori STL per te:

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

Tuttavia, non lo uso, quindi YMMV

Altri suggerimenti

Le risposte esistenti a questa domanda sono molto obsolete. Con un recente GCC e GDB funziona semplicemente TM grazie al supporto Python integrato in GDB 7.xe alle graziose stampanti libstdc ++ fornite con GCC.

Per l'esempio del PO ottengo:

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

Se non funziona automaticamente per te, consulta il primo punto elenco nel Supporto STL pagina della wiki GDB.

Puoi scrivere anche belle stampanti Python per i tuoi tipi, vedi Pretty Printing nel manuale GDB.

C'è sempre l'ovvio: definire la propria funzione di test ... Chiamala da gdb. Per esempio:.

#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.
}

E

....
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) 

Il stl-views.gdb era la risposta migliore che ci fosse, ma non più.

Questo non è ancora integrato nella linea principale GDB, ma ecco cosa ottieni usando 'archer-tromey-python' ramo :

(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

Prova a de-referenziare i contenitori STL: in questa pagina: http: //www.yolinux .com / tutorial / GDB-Commands.html

Puoi aggirare il secondo problema (Cannot evaluate function -- may be inlined) assicurandoti che il compilatore usi le informazioni di debug di DWARF-2 (o 3 o 4) quando compili il tuo programma. DWARF-2 include informazioni incorporate, quindi dovresti essere in grado di utilizzare uno dei metodi che hai descritto per accedere agli elementi del tuo std::map contenitore.

Per compilare con le informazioni di debug DWARF-2, aggiungi il flag -gdwarf-2 al tuo comando di compilazione.

Le risposte sopra funzionano e vanno bene. Se stai usando stl-views.gdb, ecco il modo corretto di visualizzare le mappe e gli elementi al suo interno. Lascia che la tua mappa sia la seguente:     std::map<char, int> myMap;

(gdb) pmap myMap char int

vale a dire. pmap <variable_name> <left_element_type> <right_element_type> per vedere gli elementi nella mappa.

Spero che sia d'aiuto.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top