Wie drucke ich die Elemente eines C ++ - Vektors in GDB aus?
Frage
Ich möchte den Inhalt von a untersuchen std::vector
Wie mache ich das in GDB? Nehmen wir an, es ist ein std::vector<int>
Der Einfachheit halber.
Lösung
Um Vektor STD :: Vektor MyVector -Inhalt anzuzeigen, geben Sie einfach GDB ein:
(gdb) print myVector
Dies erzeugt einen ähnlichen Ausgang wie:
$1 = std::vector of length 3, capacity 4 = {10, 20, 30}
Um oben zu erreichen, müssen Sie GDB 7 (ich habe es auf GDB 7.01 getestet) und etwas Python Pretty-Printer haben. Der Installationsprozess von diesen wird auf beschrieben GDB -Wiki.
Darüber hinaus funktioniert dies nach der Installation gut mit Finsternis C ++ Debugger GUI (und jede andere IDE, die GDB verwendet, wie ich denke).
Andere Tipps
Mit GCC 4.1.2, um das gesamte std :: vector zu druckenu003Cint> MyVector genannt, machen Sie Folgendes:
print *(myVector._M_impl._M_start)@myVector.size()
Um nur die ersten N -Elemente zu drucken, tun Sie:
print *(myVector._M_impl._M_start)@N
Erläuterung
Dies hängt wahrscheinlich stark von Ihrer Compiler -Version ab, aber für GCC 4.1.2 ist der Zeiger auf das interne Array:
myVector._M_impl._M_start
Und der GDB -Befehl zum Drucken von N -Elementen eines Arrays, das mit Zeiger P beginnt, lautet:
print P@N
Oder in kurzer Form (für einen Standard .gdbinit):
p P@N
STL -Container beim Debuggen ist ein Problem. Hier sind 3 verschiedene Lösungen, die ich in der Vergangenheit verwendet habe, keiner von ihnen 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 fantastische Unterstützung für das Ansehen von STL -Containern. Dies funktioniert für verschachtelte Container, aber dies gilt nur für ihre Implementierung für STL und funktioniert nicht, wenn Sie einen STL -Container in einen Boost -Container stellen.
3) Schreiben Sie Ihre eigene "Drucken" -Funktion (oder Ihre Methode) für das spezifische Element, das Sie beim Debuggen und "Anruf" in GDB zum Drucken des Elements drucken möchten. Beachten Sie, dass wenn Ihre Druckfunktion im Code G ++ nirgendwo aufgerufen wird, und die Funktion "Drucken" nicht von GDB gefunden wird (Sie erhalten eine Nachricht, dass die Funktion eingefügt wird). Kompilieren Sie also mit -Feke-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 Beschaffung von ~/.gdbinit) die damit verbundene Hilfe wie diese
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
Beispiel Verwendung:
(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'}}