Frage

Angenommen, so etwas haben:

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

Ich möchte in der Lage sein, den Inhalt der Karte zu prüfen, das Programm von gdb läuft.
Wenn ich den Index-Operator versuchen, mit erhalte ich:

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

die Methode find Verwendung nicht zu besseren Ergebnissen:

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

Gibt es eine Möglichkeit, dies zu erreichen?

War es hilfreich?

Lösung

Ich denke, es ist nicht, zumindest nicht, wenn Ihre Quelle etc. Allerdings optimiert ist, gibt es einige Makros für GDB, die STL-Container für Sie überprüfen können:

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

Allerdings habe ich nicht diese, so YMMV

Andere Tipps

Die bestehenden Antworten auf diese Frage sind sehr veraltet. Mit einer aktuellen GCC und GDB es funktioniert einfach TM dank der integrierten Python Unterstützung in GDB 7.x und der libstdc ++ ziemlich Drucker, die mit GCC kommen.

Für das Beispiel der OP erhalte ich:

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

Wenn es nicht automatisch arbeitet für Sie den ersten Aufzählungspunkt auf der STL Unterstützung Seite des GDB-Wiki.

Sie können schreiben Python ziemlich Drucker für Ihre eigenen Arten finden Sie unter Pretty Printing in dem GDB-Handbuch.

Es gibt immer die Hand: Definieren Sie Ihre eigene Test-Funktion ... Nennen Sie es von gdb. Z.

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

Und:

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

Die stl-views.gdb verwendet, um die beste Antwort, dort zu sein, aber nicht mehr.

Dies ist nicht in den Mainline GDB integriert noch, aber hier ist das, was man den 'Archer-Tromey-Python' erhält mit Zweig :

(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

Versuchen De-Referenzierung STL-Container: Auf dieser Seite: http: //www.yolinux .com / tutorials / GDB-Commands.html

Sie können rund um das zweite Problem bekommen (Cannot evaluate function -- may be inlined), indem Sie sicherstellen, dass Ihr Compiler ZWERG-2 (oder 3 oder 4) Debug-Informationen verwendet, wenn Sie Ihr Programm kompilieren. ZWERG-2 enthält inlining Informationen, so dass Sie sollten Sie in der Lage eine der beiden Methoden verwenden beschriebenen Elemente Ihres std::map Container zuzugreifen.

Um mit ZWERG-2 Debug-Informationen kompilieren, fügen Sie den -gdwarf-2 Flag auf Ihre Kompilierungsbefehl.

Die Antworten oben arbeiten und fein. Falls Sie stl-views.gdb verwenden, hier ist der richtige Weg, um die Karten und Elemente im Innern der Betrachtung. Lassen Sie Ihre Karte ist wie folgt:     std::map<char, int> myMap;

(gdb) pmap myMap char int

d. pmap <variable_name> <left_element_type> <right_element_type> die Elemente in der Karte zu sehen.

Ich hoffe, das hilft.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top