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 o fin in GDB, è step-out in IDEA o Eclipse.

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.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *