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.

War es hilfreich?

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'}}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top