Ho digitato help
mentre ero nel GDB ma non ho “trovato nulla su step-into, step -over e step-out. Ho inserito un punto di interruzione in un programma Assembly in _start
(break _start
). Successivamente ho digitato next
e ha terminato il debug. Immagino fosse perché ha terminato _start
e non “t entra come volevo.
Qualcuno mi può aiutare?
Commenti
- Leggi i documenti GDB completi. Per quanto ricordo, sono stati molto utili su questo, quando lho 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 essere stati scambiati nel mio cervello. Quindi, non posso ' scrivere una risposta. Ma se lo capisci dai manuali, puoi rispondere alla tua stessa domanda per un bonus.
- @MAP I ' riproverò. Ho provato a utilizzare un debugger migliore (KDbg) ma non ' riesco a usarlo in Ubuntu .
- gdb è un buon debugger. Potresti voler usare Emacs come frontend.
- gdb è un pessimo debugger. Ci sono una miriade di estensioni per gestire quanto fa schifo. Sintassi orribile, comandi non consostent, impaginazione orribile goffa, formattazione arcaica, ' non hanno un hexdump. Quindi no, ' non è un buon debugger. Se pensi che lo sia, non hai ' utilizzato un buon debugger.
Risposta
help running
fornisce alcuni suggerimenti:
Ci sono step
e next
istruzioni (e anche nexti
e 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 che step
passa nelle subroutine, ma next
passa oltre subroutine.
Il step
e stepi
(e il next
e nexti
) si distinguono per incrementi di “riga” o “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 in https://sourceware.org/gdb/onlinedocs/gdb/Continuing-and-Stepping.html
Commenti
- Che cosa fa significa fino a raggiungere una riga di origine diversa ?
-
for(i=0;i<10;i++) { printf("%d\n",i); }
è una riga di origine ma più istruzioni. - Cè un modo per uscire? Non sono riuscito ' a trovarlo nella Guida in esecuzione.
- Cosa intendi con " esci "? Il comando
finish
completerà lo stack frame corrente, che normalmente completerà la subroutine corrente e tornerà al chiamante. -
finish
ofin
in GDB, èstep-out
inIDEA
oEclipse
.
Risposta
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 potevo semplicemente impostare un altro punto di interruzione dopo il ciclo e poi lasciare che il programma continue
finisse il ciclo e in seguito corri nel punto di interruzione. Scusa se questo è ovvio per la maggior parte delle persone, ma probabilmente è utile per chi cerca una risposta a questa domanda.
Risposta
Usa il comando “finish”; questo a volte fa la stessa cosa di “step-out”. Finirà quello che sta facendo lo stack (una funzione, di solito) e passerà alla riga successiva. Cerca il comando per maggiori informazioni.