2012-05-29 3 views
8

Czy jest możliwe ustawienie warunkowego punktu przerwania w GDB, gdzie wyrażenie warunku zawiera obiekty dowolnego typu klasy?Warunkowy punkt przerwania GDB dla typów arbitralnych

Potrzebuję ustawić punkt przerwania wewnątrz funkcji, w której warunek sprawdzi, czy zmienna łańcuchowa elementu obiektu równa się powiedzeniu "foo". Oto coś takiego:

condition 1 myObject->myStringVar == "foo" 

Ale to nie działa. Czy GDB dopuszcza tylko warunkowe punkty przerwania na typach pierwotnych i char *? Czy jest jakiś sposób ustawić warunkowy punkt przerwania na typach niepochodzących?

+0

Podobne/sam problem w MSVC (faktycznie nie duplikat, tylko prawdopodobnie spowodowane przez same problem ..): http://stackoverflow.com/questions/1740858/how-to-create-conditional-breakpoint-with-stdstring – HostileFork

Odpowiedz

8

Czy jest jakiś sposób ustawić warunkowy punkt przerwania na niepochodzących z pierwotnych typów ?

Tak, jednym ze sposobów, aby to zrobić jest konwersja nie prymitywny typ, prymitywna, w danym przypadku do char* i używać strcmp do porównywania ciągów znaków.

5

Odpowiedź na twoje pytanie, które zadałeś, brzmi: tak ... w ogólnym przypadku działa dla dowolnych klas i funkcji oraz funkcji członków klasy. Nie utknąłeś z testowaniem prymitywnych typów. Przeciążenia członków klasy, takie jak operator==, powinny działać.

Ale standardowa biblioteka jest szalona. Założę się problem z tym przypadku ma do czynienia z operator== na std :: string będący globalny przeciążenia operatora matrycy:

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

Więc deklaracje jak:

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

I często mają problemy z gdb ... i nie byłbym zaskoczony, gdyby nie wiedział, co z tym zrobić!

Należy pamiętać, że oprócz tego, co @ ks1322 powiedział, można zatrzymać się w C++ królestwa i prościej wykorzystać std::string::compare():

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