Angenommen, wir haben so etwas:
#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 überprüfen, auf der das Programm von gdb ausgeführt wird.
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?
Die vorhandenen 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 des OP bekomme ich:
Wenn es für Sie nicht automatisch funktioniert, sehen Sie den ersten Aufzählungspunkt auf der STL-Support- Seite des GDB-Wikis.
Sie können auch hübsche Python-Drucker für Ihre eigenen Typen schreiben, siehe Hübsches Drucken im GDB-Handbuch.
quelle
Could not find operator[]
.Es gibt immer das Offensichtliche: Definieren Sie Ihre eigene Testfunktion ... Rufen Sie sie von gdb aus auf. Z.B:
Und:
quelle
Das war
stl-views.gdb
früher die beste Antwort, aber nicht mehr.Dies ist noch nicht in die
GDB
Hauptzeile integriert , aber hier ist, was Sie mit dem Zweig 'archer-tromey-python' erhalten :quelle
Versuchen Sie, STL-Container zu de-referenzieren: auf dieser Seite: http://www.yolinux.com/TUTORIALS/GDB-Commands.html
quelle
Die obigen Antworten funktionieren und sind in Ordnung. Wenn Sie stl-views.gdb verwenden, finden Sie hier die richtige Methode zum Anzeigen der darin enthaltenen Karten und Elemente. Lassen Sie Ihre Karte wie folgt aussehen:
std::map<char, int> myMap;
dh
pmap <variable_name> <left_element_type> <right_element_type>
um die Elemente in der Karte zu sehen.Hoffentlich hilft das.
quelle
Sie können das zweite Problem (
Cannot evaluate function -- may be inlined
) umgehen, indem Sie sicherstellen, dass Ihr Compiler beim Kompilieren Ihres Programms DWARF-2-Debugging-Informationen (oder 3 oder 4) verwendet. DWARF-2 enthält Inlining-Informationen, sodass Sie eine der beschriebenen Methoden verwenden können sollten, um auf Elemente Ihresstd::map
Containers zuzugreifen .Fügen Sie zum Kompilieren mit DWARF-2-Debuginformationen das
-gdwarf-2
Flag zu Ihrem Kompilierungsbefehl hinzu.quelle