2012-05-29 15 views
8

È possibile impostare un punto di interruzione condizionale in GDB in cui l'espressione di condizione contiene oggetti di tipi di classe arbitrari?Punto di interruzione condizionale GDB su tipi arbitrari

È necessario impostare un punto di interruzione all'interno di una funzione in cui la condizione verificherà se una variabile di stringa membro di un oggetto equivale a dire "pippo". Quindi, qualcosa del tipo:

condition 1 myObject->myStringVar == "foo" 

Ma non funziona. GDB consente solo breakpoint condizionali su tipi primitivi e char *? C'è un modo per impostare un breakpoint condizionale su tipi non primitivi?

+0

correlati/stesso problema in MSVC (in realtà non un duplicato, solo probabilmente causato da stesso problema ..): http://stackoverflow.com/questions/1740858/how-to-create-conditional-breakpoint-with-stdstring – HostileFork

risposta

8

C'è un modo per impostare un punto di interruzione condizionale su tipi non primitivi ?

Sì, un modo per farlo è quello di convertire tipo non primitivo ad una primitiva, nel tuo caso per char*, e utilizzare strcmp per confrontare le stringhe.

condition 1 strcmp(myObject->myStringVar.c_str(),"foo") == 0 
5

La risposta alla tua domanda che hai fatto è sì ... nel caso generale funziona per classi e funzioni arbitrarie, e le funzioni di membro di classe. Non sei bloccato con test di tipi primitivi. Gli overload di membri della classe, come operator==, dovrebbero funzionare.

Ma la libreria standard è piuttosto folle. Scommetto che il problema con questo caso ha a che fare con la operator== per std :: string essere un sovraccarico di operatore su modelli globali :

http://www.cplusplus.com/reference/string/operators/

Quindi le dichiarazioni sono come:

template<class charT, class traits, class Allocator> 
    bool operator==(const basic_string<charT,traits,Allocator>& rhs, 
       const charT* lhs); 

I spesso hanno problemi con gdb ... e non sarei sorpreso se non sapesse cosa farmene!

Nota che, oltre a ciò che @ ks1322 ha detto, si poteva stare in C++ regno e più semplicemente utilizzare std::string::compare():

condition 1 myObject->myStringVar.compare("foo") == 0 
Problemi correlati