Was ist der Unterschied zwischen nexti und stepi in gdb?

Lesezeit: 2 Minuten

Benutzeravatar von Kobayashi
Kobayashi

Beim Debuggen einer ausführbaren Datei mit gdbgibt es zwei Befehle, mit denen wir die Ausführung schrittweise durchlaufen können:

  • stepi und
  • nexti

Was ist/sind der/die Unterschied/e zwischen diesen beiden und warum sollte jemand einen dem anderen vorziehen?

Hilfe in gdb verwenden sagt:

stepi: Schritt eine Anweisung genau.

nexti: Schritt eine Anweisung, aber weiter durch Subroutinenaufrufe.

Da wir es hier mit Anweisungen und Maschinencode zu tun haben (dem kleinsten Teil eines ausgeführten Programms), kann ich nicht herausfinden, was die Unterprogrammaufrufe sind.

  • Wenn Sie sich in einem Funktionsaufruf befinden stepi springt in die erste Anweisung der Funktion und stoppt. Wenn du benutzt nexti Die Funktion wird ausgeführt und nach dem Aufruf auf der Anweisung beendet. Die Dokumentation kann hilfreich sein: sourceware.org/gdb/onlinedocs/gdb/Continuing-and-Stepping.html. Unterprogrammaufrufe sind call Anweisungen.

    – Michael Petsch

    26. August 2018 um 8:40 Uhr


  • @MichaelPetch Ist es tatsächlich, danke

    – Kobayashi

    26. August 2018 um 8:43 Uhr


  • Das nexti stoppt bei der nächsten Anweisung danach call nur wenn die call tatsächlich zurückkehrt (im Falle eines Fehlers oder absichtlicher Änderung/Nichtverwendung der Rücksendeadresse, der call kann nie zur nächsten Anweisung zurückkehren).

    – Ped7g

    26. August 2018 um 10:04 Uhr

Benutzeravatar von Uddhav P. Gautam
Uddhav P. Gautam

stepi ist ausführlicher als nexti. wenn du anrufst sum() aus main() Funktion dann tun stepi erreicht Sie innerhalb der Funktion sum(), aber nexti nicht.

Unten ist der Screenshot, wenn Sie anrufen stepi als du dabei warst Aufruf der Summe() Anweisung (dh => 0x08048403 <+40>: call 0x8048419 <sum>). Das stepi Anleitung führt Sie in die sum().

Geben Sie hier die Bildbeschreibung ein

Wenn Sie tun nexti als du dabei warst Aufruf der Summe() Anweisung (dh => 0x08048403 <+40>: call 0x8048419 <sum>) dann verwendet es den zurückgegebenen Wert von der Summenmethode und geht zur nächsten Anweisung der Hauptmethode, Screenshot wie unten.

Geben Sie hier die Bildbeschreibung ein

Fazit: Verwenden stepi wenn Sie alle Maschinenanweisungen sehen möchten, die in Ihrem Prozessor passiert sind. Verwenden nexti wenn Sie nur die Maschinenbefehle sehen möchten, die an der ausgeführt werden main().

  • Es ähnelt den Step-over- und Step-in-Debug-Befehlen von MSVS. “Step over” erhöht niemals den Aufrufstapel (kann aber reduziert werden, wenn Sie am Ende der Methode einen Step-Over durchführen). Step-in springt eifrig zur nächsten debugfähigen Codezeile, sei es “this” oder ein verschachtelter Funktionsaufruf.

    – Ivan_Bereziuk

    5. Mai um 8:56 Uhr

Benutzeravatar von poige
poige

Der Unterschied ist wie call wird behandelt:

  • stepi taucht ein call
  • nexti läuft call führt Sie jedoch nicht durch den Code

Daher hier die semantische Regel zur besseren Erinnerung: you are to Schritt wenn du musst durchgehen

1433130cookie-checkWas ist der Unterschied zwischen nexti und stepi in gdb?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy