2015-04-19 14 views
6

Sto provando a eseguire il debug di una classe che fa molto affidamento sull'ereditarietà. Una sessione di debug è noiosa perché coinvolge un oggetto che chiama la stessa funzione su un altro oggetto in una catena. Sto sprecando un sacco di tempo a calpestare codice irrilevante che potrebbe essere meglio speso altrove.Impostare il punto di interruzione utilizzando i caratteri jolly?

Ecco il semplice: Voglio impostare un punto di interruzione su un'istanza di classe utilizzando un carattere jolly, ad esempio b Foo::*. In questo modo, quando il materiale che mi interessa entra nel campo di applicazione (come una funzione statica o una funzione membro), il debugger scatterà.

Ecco il difficile: una classe parametrizzata: voglio impostare un punto di interruzione su una funzione membro di una classe di modello utilizzando un carattere jolly, ad esempio b Foo<*>::bar. (Il vero problema è molto peggio di questo perché i parametri del template sono a loro volta classi template).

Sebbene GDB sembri lasciarmi impostare uno, il debugger non si ferma (vedi sotto). Sostiene la sua impostazione di un punto di interruzione su carichi futuri. In effetti, ho usato il collegamento statico e i simboli sono già presenti. Non ci saranno librerie caricate.

Come si imposta un punto di interruzione utilizzando i caratteri jolly?


(gdb) b CryptoPP::PK_EncryptorFilter::* 
Function "CryptoPP::PK_EncryptorFilter::*" not defined. 
Make breakpoint pending on future shared library load? (y or [n]) y 

Breakpoint 2 (CryptoPP::PK_EncryptorFilter::*) pending. 
(gdb) r 
Starting program: /home/cryptopp-ecies/ecies-test.exe 
Attack at dawn! 
[Inferior 1 (process 5163) exited normally] 

E:

(gdb) rbreak CryptoPP::DL_EncryptionAlgorithm_Xor<*>::SymmetricEncrypt 
(gdb) r 
Starting program: /home/cryptopp-ecies/ecies-test.exe 
Attack at dawn! 
[Inferior 1 (process 5470) exited normally] 
... 

(gdb) rbreak CryptoPP::*::SymmetricEncrypt 
(gdb) r 
Starting program: /home/cryptopp-ecies/ecies-test.exe 
Attack at dawn! 
[Inferior 1 (process 5487) exited normally] 

risposta

7

Si potrebbe utilizzare RBREAK in una sintassi:

(gdb) rbreak ^CryptoPP::PK_EncryptorFilter::.* 

vedere l'uomo gdb: https://sourceware.org/gdb/onlinedocs/gdb/Set-Breaks.html

Edit:

ho fatto qualche indagine e main.cc creato come segue:

#include <cstdio> 

template <class OnlyOne> class MyTemplate { 
public: 
    OnlyOne oo; 
    void myfunc(){ 
     printf("debug\n"); 
    } 
}; 


int main() { 
    MyTemplate<int> mt; 
    mt.myfunc(); 
    return 0; 
} 

Poi nel gdb:

(gdb) rbreak MyTemplate<.*>::myfunc 
Breakpoint 1 at 0x40055e: file main.cc, line 7. 
void MyTemplate<int>::myfunc(); 
(gdb) r 

debuger non ha alcun problema a trovare i punti di rompere ... Hai bisogno di provare .* anziché un semplice carattere jolly.

+0

Grazie. Nessuna gioia per il difficile (C++ e modelli). Ho aggiornato la domanda per includere il risultato. – jww

+0

sei sicuro di non aver dimenticato il punto: 'CryptoPP :: DL_EncryptionAlgorithm_Xor <.*> :: SymmetricEncrypt' –

+0

Sì, non ho usato il punto. Le pagine man dicevano che il punto era già presente. Grazie, l'ha risolto. – jww

Problemi correlati