gdb: wie drucke ich die aktuelle zeile oder finde die aktuelle zeilennummer?

94

list Befehle drucken eine Reihe von Zeilen, aber ich benötige eine einzelne Zeile, wo ich bin und wo wahrscheinlich ein Fehler aufgetreten ist.

Boris Burkov
quelle
23
backtraceoder wheresogar info lineoder einfach bt(zur Rückverfolgung). dirac.org/linux/gdb für ein GDB-Tutorial
Dwalter
btoder backtraceoder whereStapel von Funktionsaufrufen drucken foder framenächste auszuführende Zeile drucken.
Eric Wang

Antworten:

21

Ich erhalte die gleichen Informationen beim Debuggen. Allerdings nicht, während ich den Stacktrace überprüfe. Höchstwahrscheinlich hätten Sie das Optimierungsflag verwendet, denke ich. Überprüfen Sie diesen Link - etwas verwandtes.

Versuchen Sie das Kompilieren mit -g3Entfernen eines Optimierungsflags. Dann könnte es funktionieren. HTH!

kumar_m_kiran
quelle
1
Ah, obwohl mein Programm so kompiliert wurde -g, dass es Debug-Informationen enthält, bin ich derzeit in einem Stapelrahmen, der aus einer der gemeinsam genutzten Bibliotheken stammt, die anscheinend nicht kompiliert wurden, um Zeileninformationen zu enthalten. Danke, Kumar.
Boris Burkov
103

Der Befehl 'frame' gibt Ihnen das, wonach Sie suchen. (Dies kann nur mit 'f' abgekürzt werden). Hier ist ein Beispiel:

(gdb) frame
\#0  zmq::xsub_t::xrecv (this=0x617180, msg_=0x7ffff00008e0) at xsub.cpp:139
139         int rc = fq.recv (msg_);
(gdb)

Ohne Argument sagt 'frame' nur, wo Sie sich befinden (mit einem Argument ändert es den Frame). Weitere Informationen zum Befehl frame finden Sie hier .

user3162307
quelle
21

Beachten Sie, dass gdb ein leistungsstarker Befehl ist, der Anweisungen auf niedriger Ebene ausführen kann und daher an Baugruppenkonzepte gebunden ist.

Was Sie suchen, heißt de Anweisungszeiger, dh:

Das Befehlszeigerregister zeigt auf die Speicheradresse, die der Prozessor als nächstes ausführen möchte. Der Befehlszeiger wird als IP - in-16 - Bit - Modus, eip in 32-Bit - Modus, und RIP in 64-Bit - Modus.

mehr Details hier

Alle bei der GDB-Ausführung verfügbaren Register können angezeigt werden mit:

(gdb) info registers

Damit können Sie herausfinden, in welchem ​​Modus Ihr Programm läuft (welche dieser Register existieren)

dann (hier mit den gängigsten Register- Rips heutzutage, ersetzen Sie sie bei Bedarf durch eip oder sehr selten ip ):

(gdb)info line *$rip

zeigt Ihnen Zeilennummer und Dateiquelle

(gdb) list *$rip

zeigt Ihnen diese Zeile mit ein paar vorher und nachher

aber wahrscheinlich

(gdb) frame

sollte in vielen Fällen ausreichen.

Albfan
quelle
2
GDB unterstützt meines Erachtens keinen 16-Bit-Modus und ipwird hier daher nie verwendet. Anstatt den Namen des Programmzählers explizit zu buchstabieren, können Sie auch den Alias ​​von GDB verwenden : $pc. So x/10i $pcwerden 10 Befehle am aktuellen Befehlszeiger unabhängig von der Architektur zerlegt - es wird auf i386, x86_64, ARM usw. funktionieren.
Ruslan
18

Befehl wo oder Rahmen verwendet werden kann. Der Befehl where gibt weitere Informationen mit dem Funktionsnamen

pravu pp
quelle
2

Alle obigen Antworten sind korrekt. Ich bevorzuge die Verwendung des Tui-Modus (Strg + XA), der Ihren Standort und die Funktion in einem separaten Fenster anzeigt, was für die Benutzer sehr hilfreich ist. Hoffe das hilft auch.

Mazhar MIK
quelle