gdb: come stampare la riga corrente o trovare il numero di riga corrente?


94

list comandi stampa una serie di righe, ma ho bisogno di una sola riga, dove mi trovo e dove probabilmente si è verificato un errore.


23
backtraceo where, anche info lineo semplicemente bt(per backtrace). dirac.org/linux/gdb per un tutorial su gdb
dwalter

bto backtraceo wherestampa lo stack di chiamate di funzione, fo framestampa la riga successiva da eseguire.
Eric Wang,

Risposte:


21

Ottengo le stesse informazioni durante il debug. Anche se non mentre sto controllando lo stacktrace. Molto probabilmente avresti usato il flag di ottimizzazione, credo. Controlla questo collegamento - qualcosa di correlato.

Prova a compilare -g3rimuovendo qualsiasi flag di ottimizzazione. Allora potrebbe funzionare. HTH!


1
Ah, quindi anche se il mio programma è stato compilato -gper contenere informazioni di debug, al momento sono in uno stack frame, preso da una delle librerie condivise, che apparentemente non è stato compilato per contenere informazioni sulla riga. Grazie, kumar.
Boris Burkov

104

Il comando "frame" ti darà quello che stai cercando. (Questo può essere abbreviato solo "f"). Ecco un esempio:

(gdb) frame
\#0  zmq::xsub_t::xrecv (this=0x617180, msg_=0x7ffff00008e0) at xsub.cpp:139
139         int rc = fq.recv (msg_);
(gdb)

Senza un argomento, "frame" ti dice semplicemente dove ti trovi (con un argomento cambia il frame). Ulteriori informazioni sul comando frame possono essere trovate qui .


21

Tieni presente che gdb è un potente comando capace di istruzioni di basso livello, quindi è legato ai concetti di assemblaggio.

Quello che stai cercando si chiama puntatore di istruzioni, ovvero:

Il registro del puntatore dell'istruzione punta all'indirizzo di memoria che il processore tenterà di eseguire successivamente. Il puntatore dell'istruzione è chiamato ip in modalità a 16 bit, eip in modalità a 32 bit e rip in modalità a 64 bit.

maggiori dettagli qui

tutti i registri disponibili nell'esecuzione di gdb possono essere visualizzati con:

(gdb) info registers

con esso puoi trovare in quale modalità è in esecuzione il tuo programma (guardando quale di questi registri esiste)

quindi (qui usando il registro più comune rip al giorno d'oggi, sostituire con eip o molto raramente ip se necessario):

(gdb)info line *$rip

ti mostrerà il numero di riga e la sorgente del file

(gdb) list *$rip

ti mostrerà quella linea con alcuni prima e dopo

ma probabilmente

(gdb) frame

dovrebbe essere sufficiente in molti casi.


2
GDB non supporta la modalità a 16 bit credo, quindi ipnon viene mai utilizzato qui. Inoltre, invece di ortografia esplicitamente il nome del contatore di programma, è possibile utilizzare l'alias di GDB per esso: $pc. Quindi x/10i $pcdisassemblerà 10 istruzioni al puntatore di istruzioni corrente indipendentemente dall'architettura - funzionerà su i386, x86_64, ARM ecc.
Ruslan

19

Comando dove o frame può essere utilizzato. dove il comando fornirà maggiori informazioni con il nome della funzione


2

Tutte le risposte sopra sono corrette, quello che preferisco è usare la modalità tui (ctrl + XA) che mostra la tua posizione e la funzione in una finestra separata che è molto utile per gli utenti. Spero che anche questo aiuti.

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.