2012-05-29 25 views
8

¿Es posible establecer un punto de interrupción condicional en GDB donde la expresión de condición contiene objetos de tipos de clase arbitrarios?punto de corte condicional GDB en tipos arbitrarios

Necesito establecer un punto de interrupción dentro de una función donde la condición verificará si una variable de cadena miembro de un objeto equivale a decir "foo". Por lo tanto, algo como:

condition 1 myObject->myStringVar == "foo" 

Pero no está funcionando. ¿GDB solo permite puntos de interrupción condicionales en tipos primitivos y char *? ¿Hay alguna manera de que pueda establecer un punto de interrupción condicional en tipos no primitivos?

+0

Relacionado/mismo problema en MSVC (no en realidad un duplicado, solo suele deberse a la misma problema ..): http://stackoverflow.com/questions/1740858/how-to-create-conditional-breakpoint-with-stdstring – HostileFork

Respuesta

8

¿Hay alguna manera de que pueda establecer un punto de interrupción condicional en tipos no primitivos ?

Sí, una forma de hacerlo es convertir tipo no primitivo a uno primitivo, en su caso para char*, y utilizar strcmp para comparar cadenas.

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

La respuesta a su pregunta que se plantea es que sí ... en el caso general funciona para las clases y funciones arbitrarias y funciones miembro de clase. No estás atascado con la prueba de tipos primitivos. Las sobrecargas de los miembros de la clase, como operator==, deberían funcionar.

Pero la biblioteca estándar es bastante loca. Apuesto a que el problema de este caso tiene que ver con el operator== para std :: string ser una sobrecarga del operador de plantilla mundial :

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

Así que las declaraciones son como:

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

I a menudo tienen problemas con gdb ... ¡y no me sorprendería si no supiera qué hacer con eso!

Tenga en cuenta que, además de lo @ ks1322 dijo que podría permanecer en el reino del C++ y más simplemente utilizar std::string::compare():

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