Come fare un passo avanti, fare un passo avanti e uscire con GDB?


42

Ho digitato helpmentre ero nel GDB ma non ho trovato nulla su step-in, step-over e step-out. Ho inserito un punto di interruzione in un programma Assembly in _start( break _start). Successivamente ho digitato nexte ha terminato il debug. Immagino sia stato perché è finito _starte non è entrato come volevo.

Qualcuno che può aiutare?


Leggi i documenti GDB completi. Per quanto ricordo, mi hanno aiutato molto quando l'ho imparato per la prima volta. Sfortunatamente, non ho bisogno di eseguire il debug di alcun programma a quel livello per diversi decenni, quindi i comandi effettivi sembrano essersi scambiati nel mio cervello. Quindi, non posso davvero scrivere una risposta. Ma, se lo capisci dai manuali, puoi rispondere alla tua domanda per un bonus.
MAPPA

@MAP Ci riproverò. Ho provato a usare un debugger migliore (KDbg) ma non riesco a usarlo in Ubuntu .
Pichi Wuana,

Risposte:


38

help running fornisce alcuni suggerimenti:

Ci sono stepe le nextistruzioni (e anche nextie 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.

Quindi possiamo vedere questi steppassaggi nelle subroutine, ma nextpasseremo sopra alle subroutine.

La stepe stepi(e la nexte nexti) vengono distintivo entro "linea" o "incrementi istruzione".

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

Correlato è 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.

Molte altre informazioni utili sono disponibili su https://sourceware.org/gdb/onlinedocs/gdb/Continuing-and-Stepping.html


Cosa significa fino a quando non raggiunge una diversa linea di origine ?
Pichi Wuana,

1
for(i=0;i<10;i++) { printf("%d\n",i); }è una riga di origine ma più istruzioni.
Stephen Harris,

3
C'è un modo per uscire? Non ho trovato aiuto nella corsa.
nukeguy,

1
Cosa intendi con "step-out"? Il finishcomando completerà il frame di stack corrente, che normalmente completerà la subroutine corrente e tornerà al chiamante.
Stephen Harris,

@PichiWuana gdb eseguirà tutte le istruzioni di assemblaggio necessarie fino a quando non verrà raggiunta la prima istruzione che rappresenta la riga successiva del codice sorgente
U007D

0

Sono venuto qui perché avevo la stessa domanda. Alla fine ho pensato che per il mio scopo ogni volta che potevo usare qualcosa come "step-out" di un ciclo, posso semplicemente impostare un altro punto di interruzione dopo il ciclo e quindi lasciare che il programma continuefinisca il ciclo e poi corra nel punto di interruzione. Scusate se questo è ovvio per la maggior parte delle persone, ma è probabilmente utile per qualcuno che cerca una risposta a questa domanda.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.