it-swarm.com.de

Überprüfen des Inhalts von Standardcontainern (std :: map) mit gdb

Angenommen, so etwas zu 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, die das Programm ausführt, von gdb aus zu überprüfen.
Wenn ich versuche, den Indexoperator zu verwenden, erhalte ich: 

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

Die Verwendung der Suchmethode führt nicht zu besseren Ergebnissen:

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

Gibt es eine Möglichkeit, dies zu erreichen? 

80
Paolo Tedesco

Ich glaube nicht, zumindest nicht, wenn Ihre Quelle optimiert ist. Es gibt jedoch einige Makros für gdb, die STL-Container für Sie prüfen können:

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

Ich verwende dies jedoch nicht, so YMMV

32
jpalecek

Die vorhandenen Antworten auf diese Frage sind sehr veraltet. Mit einem neuen GCC und einer GDB funktioniert es einfachTM Dank der eingebauten Python-Unterstützung in GDB 7.x und den libstdc ++ hübschen Druckern, die mit GCC geliefert werden.

Für das OP-Beispiel bekomme ich:

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

Wenn dies nicht automatisch funktioniert, sehen Sie den ersten Aufzählungspunkt auf der Seite STL Support des GDB-Wikis.

Sie können auch schöne Python-Drucker für Ihren eigenen Typ schreiben, siehe Pretty Printing im GDB-Handbuch.

79
Jonathan Wakely

Es liegt immer auf der Hand: Definieren Sie Ihre eigene Testfunktion ... Nennen Sie es von gdb. Z.B.:

#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) 
20
Mr.Ree

Der stl-views.gdb war die beste Antwort, die es gab, aber nicht mehr.

Dies ist noch nicht in die Hauptlinie GDB integriert, aber hier erhalten Sie die Verwendung des 'archer-tromey-python' branch :

(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
20

Versuchen Sie die De-Referenzierung von STL-Containern: auf dieser Seite: http://www.yolinux.com/TUTORIALS/GDB-Commands.html

12
anand

Sie können das zweite Problem (Cannot evaluate function -- may be inlined) umgehen, indem Sie sicherstellen, dass Ihr Compiler beim Kompilieren des Programms DWARF-2- (oder 3 oder 4) Debuginformationen verwendet. DWARF-2 enthält Inlining-Informationen. Sie sollten daher in der Lage sein, eine der beschriebenen Methoden für den Zugriff auf Elemente Ihres std::map-Containers zu verwenden.

Um mit DWARF-2-Debug-Informationen zu kompilieren, fügen Sie Ihrem Compile-Befehl das Flag -gdwarf-2 hinzu.

0
Dan

Die obigen Antworten funktionieren und sind gut. Falls Sie stl-views.gdb verwenden, können Sie sich die darin enthaltenen Karten und Elemente richtig anzeigen lassen Lassen Sie Ihre Karte folgendermaßen aussehen: std::map<char, int> myMap;

(gdb) pmap myMap char int

pmap <variable_name> <left_element_type> <right_element_type>, um die Elemente in der Karte anzuzeigen.

Hoffentlich hilft das.

0
Mazhar MIK