Ich möchte den Inhalt eines std::vector
in GDB untersuchen. Wie mache ich das? Nehmen wir an, es ist std::vector<int>
der Einfachheit halber ein.
Ich möchte den Inhalt eines std::vector
in GDB untersuchen. Wie mache ich das? Nehmen wir an, es ist std::vector<int>
der Einfachheit halber ein.
Antworten:
Um den Inhalt von vector std :: vector myVector anzuzeigen, geben Sie einfach GDB ein:
(gdb) print myVector
Dies erzeugt eine Ausgabe ähnlich der folgenden:
$1 = std::vector of length 3, capacity 4 = {10, 20, 30}
Um dies zu erreichen, benötigen Sie GDB 7 (ich habe es auf GDB 7.01 getestet) und einen Python-Pretty-Drucker. Der Installationsprozess dieser wird im GDB-Wiki beschrieben .
Darüber hinaus funktioniert dies nach der obigen Installation gut mit der Eclipse C ++ - Debugger-GUI (und jeder anderen IDE, die GDB verwendet, wie ich denke).
$HOME/.gdbinit
notwendig war. Im Moment habe ich überhaupt keine solche Datei und gdb
zeige den Inhalt von korrekt an std::vector
. Da ich jedoch während meiner "Rambling" -Versuche gerade installiert und dann nicht kristallisiert habe cgdb
und bereits libstdc++5
installiert hatte, habe ich keine Ahnung, warum das hübsche Drucken nicht funktioniert hat, während es jetzt funktioniert.
Gehen Sie mit GCC 4.1.2 wie folgt vor, um den gesamten std :: vector <int> mit dem Namen myVector zu drucken:
print *(myVector._M_impl._M_start)@myVector.size()
Um nur die ersten N Elemente zu drucken, gehen Sie wie folgt vor:
print *(myVector._M_impl._M_start)@N
Erläuterung
Dies hängt wahrscheinlich stark von Ihrer Compilerversion ab, aber für GCC 4.1.2 lautet der Zeiger auf das interne Array:
myVector._M_impl._M_start
Der GDB-Befehl zum Drucken von N Elementen eines Arrays ab Zeiger P lautet:
print P@N
Oder in Kurzform (für eine Standard-.gdbinit):
p P@N
Cannot evaluate function -- may be inlined
_M_impl
usw.) für Ihren Compiler unter GDB 7.0+ zu finden, verwenden Sieprint /r myVector
Das "Beobachten" von STL-Containern beim Debuggen ist ein Problem. Hier sind 3 verschiedene Lösungen, die ich in der Vergangenheit verwendet habe. Keine davon ist perfekt.
1) Verwenden Sie GDB-Skripte von http://clith.com/gdb_stl_utils/ Mit diesen Skripten können Sie den Inhalt fast aller STL-Container drucken. Das Problem ist, dass dies für verschachtelte Container wie einen Stapel von Sets nicht funktioniert.
2) Visual Studio 2005 bietet eine fantastische Unterstützung für das Ansehen von STL-Containern. Dies funktioniert für verschachtelte Container, dies gilt jedoch nur für deren Implementierung für STL und funktioniert nicht, wenn Sie einen STL-Container in einen Boost-Container einfügen.
3) Schreiben Sie Ihre eigene Druckfunktion (oder -methode) für das bestimmte Element, das Sie beim Debuggen drucken möchten, und verwenden Sie "Aufruf" in GDB, um das Element zu drucken. Beachten Sie, dass wenn Ihre Druckfunktion an keiner Stelle im Code aufgerufen wird, g ++ die Eliminierung von totem Code durchführt und die Funktion 'Drucken' von GDB nicht gefunden wird (Sie erhalten eine Meldung, dass die Funktion inline ist). Kompilieren Sie also mit -fkeep-inline-Funktionen
Geben Sie Folgendes in ~ / .gdbinit ein
define print_vector
if $argc == 2
set $elem = $arg0.size()
if $arg1 >= $arg0.size()
printf "Error, %s.size() = %d, printing last element:\n", "$arg0", $arg0.size()
set $elem = $arg1 -1
end
print *($arg0._M_impl._M_start + $elem)@1
else
print *($arg0._M_impl._M_start)@$arg0.size()
end
end
document print_vector
Display vector contents
Usage: print_vector VECTOR_NAME INDEX
VECTOR_NAME is the name of the vector
INDEX is an optional argument specifying the element to display
end
Zeigen Sie nach dem Neustart von gdb (oder der Beschaffung von ~ / .gdbinit) die zugehörige Hilfe wie folgt an
gdb) help print_vector
Display vector contents
Usage: print_vector VECTOR_NAME INDEX
VECTOR_NAME is the name of the vector
INDEX is an optional argument specifying the element to display
Anwendungsbeispiel:
(gdb) print_vector videoconfig_.entries 0
$32 = {{subChannelId = 177 '\261', sourceId = 0 '\000', hasH264PayloadInfo = false, bitrate = 0, payloadType = 68 'D', maxFs = 0, maxMbps = 0, maxFps = 134, encoder = 0 '\000', temporalLayers = 0 '\000'}}