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!
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:
Ohne Argument sagt 'frame' nur, wo Sie sich befinden (mit einem Argument ändert es den Frame). Weitere Informationen zum Befehl frame finden Sie hier .
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.
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
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.
backtrace
oderwhere
sogarinfo line
oder einfachbt
(zur Rückverfolgung). dirac.org/linux/gdb für ein GDB-Tutorialbt
oderbacktrace
oderwhere
Stapel von Funktionsaufrufen druckenf
oderframe
nächste auszuführende Zeile drucken.Antworten:
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
-g3
Entfernen eines Optimierungsflags. Dann könnte es funktionieren. HTH!quelle
-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.Der Befehl 'frame' gibt Ihnen das, wonach Sie suchen. (Dies kann nur mit 'f' abgekürzt werden). Hier ist ein Beispiel:
Ohne Argument sagt 'frame' nur, wo Sie sich befinden (mit einem Argument ändert es den Frame). Weitere Informationen zum Befehl frame finden Sie hier .
quelle
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:
mehr Details hier
Alle bei der GDB-Ausführung verfügbaren Register können angezeigt werden mit:
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 ):
zeigt Ihnen Zeilennummer und Dateiquelle
zeigt Ihnen diese Zeile mit ein paar vorher und nachher
aber wahrscheinlich
sollte in vielen Fällen ausreichen.
quelle
ip
wird hier daher nie verwendet. Anstatt den Namen des Programmzählers explizit zu buchstabieren, können Sie auch den Alias von GDB verwenden :$pc
. Sox/10i $pc
werden 10 Befehle am aktuellen Befehlszeiger unabhängig von der Architektur zerlegt - es wird auf i386, x86_64, ARM usw. funktionieren.Befehl wo oder Rahmen verwendet werden kann. Der Befehl where gibt weitere Informationen mit dem Funktionsnamen
quelle
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.
quelle