Inspizieren Standardcontainer (std :: map) Inhalte mit GDB
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?
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.