Wie kann man mit GDB ein-, aussteigen und überschreiten?

42

helpWährend ich in der GDB war, habe ich getippt , aber nichts über Einsteigen, Übersteigen und Aussteigen gefunden. Ich habe einen Haltepunkt in ein Assembly-Programm in _start( break _start) eingefügt . Danach habe ich getippt nextund das Debuggen beendet. Ich denke, es war, weil es fertig war _startund nicht so einging, wie ich wollte.

Kann jemand helfen?

Pichi Wuana
quelle
Lesen Sie die vollständigen GDB-Dokumente. Soweit ich mich erinnere, waren sie dabei sehr hilfreich, als ich es zum ersten Mal lernte. Leider musste ich jahrzehntelang kein Programm auf dieser Ebene debuggen, sodass die tatsächlichen Befehle in meinem Gehirn ausgetauscht zu sein scheinen. Ich kann also keine wirkliche Antwort schreiben. Aber wenn Sie es aus den Handbüchern herausfinden, können Sie Ihre eigene Frage für einen Bonus beantworten.
KARTE
@MAP Ich werde es noch einmal versuchen. Ich habe versucht, einen besseren Debugger (KDbg) zu verwenden, aber es gelingt mir nicht, ihn in Ubuntu zu verwenden .
Pichi Wuana

Antworten:

38

help running liefert einige Hinweise:

Es gibt stepund nextAnweisungen (und auch nextiund 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.

So können wir sehen , dass stepSchritte in Subroutinen, sondern nextwird Schritt über Subroutinen.

Das stepund stepi(und das nextund nexti) unterscheiden sich durch "Zeilen" - oder "Anweisungs" -Inkremente.

step -- Step program until it reaches a different source line
stepi -- Step one instruction exactly

Verwandte ist 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

Stephen Harris
quelle
Was bedeutet es, bis es eine andere Quelle erreicht ?
Pichi Wuana
1
for(i=0;i<10;i++) { printf("%d\n",i); }ist eine Quellzeile, aber mehrere Anweisungen.
Stephen Harris
3
Gibt es einen Ausweg? Ich konnte es nicht in der Hilfe finden, die läuft.
Nukeguy
1
Was meinst du mit "aussteigen"? Der finishBefehl vervollständigt den aktuellen Stapelrahmen, der normalerweise die aktuelle Unterroutine vervollständigt und zum Aufrufer zurückkehrt.
Stephen Harris
@PichiWuana gdb durchläuft so viele Assembler-Anweisungen wie nötig, bis die erste Anweisung für die nächste Zeile des Quellcodes erreicht ist
U007D
0

Ich bin hergekommen, weil ich die gleiche Frage hatte. Schließlich stellte ich fest, dass ich für meinen Zweck jederzeit so etwas wie ein "Step-out" einer Schleife verwenden kann, indem ich nach der Schleife einen anderen Haltepunkt setze und dann das Programm continuedie Schleife beenden und danach in den Haltepunkt laufen lasse . 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.

fjahr
quelle