L'interfaccia del debugger
debugger
Per i linguaggi C e C++, KDevelop contiene un debugger interno che è direttamente integrato nell'editor. Tecnicamente è implementato come un frontend che usa gdb (portable &GNU; debugger) attraverso una pipe. Il debugger può essere avviato in diversi modi:
Con DebugAvvia, il programma principale del proprio progetto viene caricato nel debugger.
Usando DebugEsamina il file core... viene caricato in memoria un file core che è stato generato dal kernel del sistema operativo quando il programma è andato in crash (la generazione di file core potrebbe essere disattivata sul proprio sistema, vedere ulimit(1)). Questo è utile per un'analisi post-mortem del programma.
Con DebugCollega al processo si usa il debugger su un programma già in esecuzione. Verrà mostrata una lista di processi da dove si può selezionare quello che dovrà essere supervisionato dal debugger.
Notare che questo debug è possibile se il proprio progetto è stato compilato con l'attivazione delle informazioni di debug. Possono essere attivate nella finestra di dialogo Opzioni compilatore. Quando questa opzione è attivata il compilatore genera dati aggiuntivi che permettono al debugger di associare i nomi dei file e numeri di linea con gli indirizzi nel file eseguibile.
Il frontend del debugger fornisce diverse viste nel
processo:
Se si tenta di effettuare il debug di un progetto che non ha le informazioni di debug si riceverà il messaggio Sorgente inesistente... nella barra di stato. Se si tenta di impostare un breakpoint, viene visualizzato come Pendente (aggiungi) nella finestra dei breakpoint (vedere sotto).
Variabili
osservare variabili
Questa finestra elenca i valori di tutte le variabili locali del punto corrente dell'esecuzione del programma. Esso include le variabili dell'intero stack delle chiamate, &ie; la funzione dove è stato interrotto il processo, la funzione che ha chiamato quella funzione e così via fino a main().
Un altro ramo di variabili contiene le variabili di osservazione. Si possono configurare quali variabili mostrare qui. Possono essere osservate sia le variabili locali che globali. Si possono aggiungere variabili facendo clic sul pulsante Aggiungi o premendo RETURN mentre è selezionata la voce Espressione da controllare. Possono essere rimosse nuovamente attraverso il menu contestuale.
Stack del frame
Stack del frame
(... da scrivere ...)
Breakpoint
Breakpoint
In questa finestra vengono mostrati e modificati i breakpoint. &tdevelop; usa GDB, quindi per capire pienamente le sue funzionalità di debug, è necessario conoscere anche quest'ultimo.
Se si vuole controllare il codice sorgente, i breakpoint sono definiti nel file tdevelop/languages/cpp/debugger/breakpoint.h.
Nel bordo sinistro la finestra presenta vari pulsanti per:
Aggiungere un breakpoint vuoto
Modificare il breakpoint selezionato
Eliminare il breakpoint selezionato
Rimuovere tutti i breakpoint
La parte principale della finestra è costituita da una tabella con 7 colonne. Ogni linea della tabella rappresenta un breakpoint. Le colonne sono:
Casella di selezione
Il tipo può essere: Non Valido, File:Linea, Punto di Controllo, Indirizzo, Funzione
Stato: i valori possono essere:
Attivo
Disabilitato: ogni breakpoint può essere abilitato
o disabilitato
; finché non viene abilitato, non ha effetti sul programma.
Pendente (aggiungi): un breakpoint è in questo stato se non è disponibile nessuna informazione di debug. Dalla pagina Info di GDB: Se una specifica posizione del breakpoint non viene trovata, potrebbe essere all'interno di una libreria condivisa (shared) che non è stata ancora caricata. In questo caso, si può far creare a GDB un breakpoint speciale (noto come breakpoint pendente
) che tenterà di effettuare la propria risoluzione quando verrà caricata la libreria condivisa.
Pendente (chiaro)
Pendente (modifica)
Posizione nel formato nomefile:numerolinea
Condizione
Ignora il conteggio: se esiste un numero COUNT maggiore di zero, per le prossime COUNT volte in cui viene raggiunto il breakpoint, l'esecuzione del programma non verrà interrotta; gdb non intraprende alcuna azione, a parte decrementare il valore della variabile.
Trovati: conta quante volte è stato raggiunto il breakpoint.
Disassembla
disassembla
(... da scrivere ...)
Impostare i breakpoint
(... da scrivere ...)
Opzioni
Visualizzare nomi mangled (storpiati)
nomi storpiati
storpiaturanome
Nel C++, i nomi delle funzioni negli eseguibili sono detti mangled
(storpiati), &ie; il nome della funzione include le informazioni sul tipo degli argomenti. Questo è necessario per il supporto al sovraccaricamento delle funzioni. L'algoritmo di mangling non è standardizzato e differisce persino tra versioni diverse del compilatore C++ &GNU;.
Normalmente nella finestra di disassemblaggio vengono visualizzati nomi non mangled, quindi le firme delle funzioni sono simili a come appaiono nel codice sorgente, quindi facilmente leggibili. In alternativa si può decidere di vedere i nomi mangled.
Tentare di impostare i breakpoint al caricamento delle librerie
lazy breakpoint
Breakpointlazy
Il backend del debugger gdb non permette di inserire breakpoint all'interno di codice non caricato. Questo potrebbe essere sconveniente in una applicazione altamente modulare, dove spesso il codice viene caricato su richiesta come un plugin (usando la funzione di libc dlopen(3)), quindi &tdevelop; ha esteso il proprio supporto per i breakpoint nelle librerie condivise. Se si imposta questa opzione si potranno impostare i breakpoint in librerie che non sono state caricate. Quando gdb notificherà che una libreria è stata caricata, &tdevelop; tenterà di impostare i breakpoint sospesi.
Abilitare la barra degli strumenti fluttuante
barra degli strumenti del debugger
barra degli strumentidebugger
(... da scrivere ...)