Ich habe help
eingegeben, während ich in der GDB war, aber nichts über Step-in, Step gefunden -over und step-out. Ich habe einen Haltepunkt in ein Assembly-Programm in _start
(break _start
) eingefügt. Danach habe ich next
und das Debuggen wurde beendet. Ich denke, es lag daran, dass es _start
beendet hat und nicht „t Schritt in wie ich wollte.
Wer kann helfen?
Kommentare
- Lesen Sie die vollständigen GDB-Dokumente. Soweit ich mich erinnere, waren sie sehr hilfreich, als ich es zum ersten Mal lernte. Leider musste ich ' mehrere Jahrzehnte lang kein Programm auf dieser Ebene debuggen, sodass die tatsächlichen Befehle in meinem Gehirn ausgelagert zu sein scheinen. Ich kann also ' nicht wirklich eine Antwort schreiben. Wenn Sie es jedoch aus den Handbüchern herausfinden, können Sie Ihre eigene Frage für einen Bonus beantworten.
- @MAP Ich ' werde es erneut versuchen. Ich habe versucht, einen besseren Debugger (KDbg) zu verwenden, aber ' gelingt es nicht, ihn in Ubuntu zu verwenden / li>
- gdb ist ein guter Debugger. Vielleicht möchten Sie Emacs als Frontend verwenden.
- gdb ist ein schrecklicher Debugger. Es gibt eine Vielzahl von Erweiterungen, die sich damit befassen, wie viel es saugt. Schreckliche Syntax, nicht konsostente Befehle, klobiges schreckliches Paging, archaische Formatierung, ' haben keinen Hexdump. Also nein, es ist ' kein guter Debugger. Wenn Sie glauben, dass dies der Fall ist, haben Sie ' keinen guten Debugger verwendet.
Antwort
help running
enthält einige Hinweise:
Es gibt step
und next
Anweisungen (und auch nexti
und stepi
).
(gdb) help next Step program, proceeding through subroutine calls. Usage: next [N] Unlike "step", if the current source line calls a subroutine, this command does not enter the subroutine, but instead steps over the call, in effect treating it as a single source line.
Wir können also sehen, dass step
in Unterprogramme eintritt, aber next
einen Schritt ausführt über Unterprogramme.
Die step
und stepi
(und die next
und nexti
) unterscheiden sich durch „Zeilen“ – oder „Anweisungs“ -Inkremente.
step -- Step program until it reaches a different source line stepi -- Step one instruction exactly
Verwandte Themen sind finish
:
(gdb) help finish Execute until selected stack frame returns. Usage: finish Upon return, the value returned is printed and put in the value history.
Weitere nützliche Informationen finden Sie unter https://sourceware.org/gdb/onlinedocs/gdb/Continuing-and-Stepping.html
Kommentare
- Was macht das? bedeutet mit bis es eine andere Quellzeile erreicht ?
-
for(i=0;i<10;i++) { printf("%d\n",i); }
ist eine Quellzeile, aber mehrere Anweisungen. - Gibt es eine Möglichkeit zum Ausstieg? ' konnte es nicht in der laufenden Hilfe finden.
- Was meinen Sie mit " step-out "? Der Befehl
finish
vervollständigt den aktuellen Stapelrahmen, der normalerweise die aktuelle Unterroutine vervollständigt und zum Aufrufer zurückkehrt. -
finish
oderfin
in GDB ist diestep-out
inIDEA
oderEclipse
.
Antwort
Ich bin hierher gekommen, weil ich dieselbe Frage hatte . Ich dachte mir schließlich, dass ich für meinen Zweck jedes Mal, wenn ich so etwas wie „Aussteigen“ aus einer Schleife verwenden könnte, einfach einen anderen Haltepunkt nach der Schleife setzen und dann das Programm continue
beenden lassen könnte die Schleife und laufen in den Haltepunkt danach. Es tut uns leid, wenn dies für die meisten Menschen offensichtlich ist, aber es ist wahrscheinlich hilfreich für jemanden, der nach einer Antwort auf diese Frage sucht.
Antwort
Verwenden Sie den Befehl „beenden“; Dies macht manchmal das Gleiche wie „Step-out“. Es beendet, was der Stapel tut (normalerweise eine Funktion), und geht danach zur nächsten Zeile. Weitere Informationen finden Sie im Befehl.