2016-03-04 26 views
7

Ho problemi con l'utilizzo di GDB sul mio programma C++. Voglio impostare un punto di interruzione per la mia funzione membro della classe e non sono sicuro della sintassi su come farlo. Il mio programma sta funzionando in questo momento e sto solo cercando di imparare a usare GDB. Il mio problema è che tutte le informazioni che trovo on line riguardano solo un file main() e nessun'altra funzione o classe e se coinvolgono le classi è solo usando una funzione con un'istruzione return return.Punto di interruzione C++ GDB per funzioni membro

Ho una classe dell'albero di ricerca binaria. Voglio impostare un punto di interruzione su una funzione nel mio programma. ecco la sezione del mio file di intestazione.

class BST 
{ 
    BST() 
    ... 
    private: 
    int add((BST * root, BST *src); 
} 

Sto telnettando in un server linux a linea di comando per la scuola. Posso ottenere GDB in esecuzione con il mio programma bene con g ++ -g * .cpp (ci sono altri file che funzionano bene) e il file viene salvato come a.out. Corro GDB con

gdb ./a.out 

e mi trovo in GDB. Posso ottenere un punto di interruzione per la funzione di visualizzazione vuoto bene con

b BST::disp_block() 

ma come faccio a farlo con la funzione add ho cercato

b BST::int add(BST*, BST *) 
b int BST::add(BST*, BST *) 
b BST::add(BST*, BST *) 

e ho anche provato con i nomi degli argomenti

b BST::int add(BST * root, BST * src) 
b int BST::add(BST * root, BST * src) 
b BST::add(BST * root, BST * src) 

e continuo a ricevere l'errore

Function "____" not defined. 
Make break point pending on future shared library load? (y or [n]) 

Come si imposta un punto di interruzione per una funzione membro come questa? Im supponendo che i punti di osservazione siano dello stesso formato, se non lo si potrebbe spiegare anche questo.

+2

In assenza di sovraccarichi o se si desidera interrompere tutti i sovraccarichi,' b BST :: add'. Non c'è bisogno di argomenti. Si noti che è necessario includere lo spazio dei nomi anche se la classe si trova in uno spazio dei nomi. –

+1

È anche possibile impostare un punto di interruzione in gdb tramite nomefile: numero di telefono. Se la tua funzione è in bst.c, sulla riga 25, il comando sarà: (gdb) b bst.c: 25 – JGroven

risposta

6

Come diceva Dark Falcon, break BST::add dovrebbe funzionare se non si verificano sovraccarichi.

È anche possibile digitare:

(gdb) break 'BST::add(<TAB> 

(notare l'apice singolo). Questo dovrebbe indurre GDB per eseguire scheda di completamento, e finire la linea in questo modo:

(gdb) break 'BST::add(BST*, BST*) 

e quel punto è possibile aggiungere la terminazione ' 'e premere Invio per aggiungere il punto di interruzione.

posso ottenere un punto di interruzione per la funzione di visualizzazione vuoto

tipo di ritorno della funzione non fa parte della sua firma e ha nulla a che fare con quello che sta succedendo.

+3

Un altro trucco da conoscere è usare 'info func' con un argomento regexp per trovare cosa gdb pensa la funzione potrebbe essere nominata. –

2

Potrebbe essere necessario specificare lo spazio dei nomi se definito per la classe. Se diverso dallo standard namespace std. Il nome del file è facoltativo, se stai eseguendo il binario corretto. È possibile verificare se il simbolo esiste nell'eseguibile tramite. Comando "nm -C", dove -C gestisce il nome mangling per C++.

Quindi per riepilogare con un esempio: Se lo spazio dei nomi è "mySpace" e la classe è "X" il cui membro è "Y", il punto di interruzione dovrebbe essere come quello seguente, "(gdb) b mySpace :: X :: Y "

Problemi correlati