subaru - gdb tutorial
Cómo imprimir la variable<tipo incompleto> en gdb (4)
A veces, gdb imprime "tipo incompleto" para algún tipo de variables. ¿Qué significa esto y cómo podemos ver ese valor?
Lo que he encontrado es que si desensambla una función que utiliza el tipo de estructura incompleta, gdb ''descubre'' los miembros de la estructura y puede mostrarlos posteriormente. Por ejemplo, supongamos que tiene una estructura de cadena:
struct my_string {
char * _string,
int _size
} ;
algunas funciones para crear y obtener la cadena a través del puntero:
my_string * create_string(const char *) {...}
const char * get_string(my_string *){...}
y una prueba que crea una cadena:
int main(int argc, char *argv[]) {
my_string *str = create_string("Hello World!") ;
printf("String value: %s/n", get_string(str)) ;
...
}
Ejecútelo en gdb e intente ''imprimir * str'' y obtendrá una respuesta de ''tipo incompleto''. Sin embargo, intente ''disassemble get_string'' y luego ''print * str'' y mostrará la estructura y los valores correctamente. No tengo idea de por qué esto funciona, pero lo hace.
No sé el significado completo del error, pero como señala Peter, el desmontaje de un método relacionado hace algo que hace que algunas de estas definiciones de tipo estén disponibles.
Mi ejemplo:
En .h para una clase, esa clase incluía una declaración directa de una clase de ayuda interna para que la clase externa pudiera contener un puntero a ella. El correspondiente .cpp tenía la definición completa de la clase de ayuda interna.
Al introducir un método de la clase externa, gdb reportó el tipo incompleto para una desreferencia del puntero a la instancia de clase interna a través de una instancia de la clase externa.
Emitir el comando disasemble en uno de los métodos en la clase externa permitió a gdb comprender la estructura de la clase interna usando el mismo puntero que falló anteriormente.
Significa que el tipo de esa variable se ha especificado de forma incompleta. Por ejemplo:
struct hatstand;
struct hatstand *foo;
GDB sabe que foo
es un puntero a una estructura hatstand
, pero los miembros de esa estructura no han sido definidos. Por lo tanto, "tipo incompleto".
Para imprimir el valor, puede convertirlo a un tipo compatible.
Por ejemplo, si sabes que foo
es realmente un puntero a una estructura de lampshade
:
print (struct lampshade *)foo
O bien, puede imprimirlo como un puntero genérico o tratarlo como si fuera un entero:
print (void *)foo
print (int)foo
Ver también estas páginas del manual de GDB:
Yo tuve el mismo problema. Si carga los símbolos de sus bibliotecas manualmente:
set auto-solib-add off
attach thread_id
shared any_lib
shared another_lib
Debe cargar los símbolos de la biblioteca, donde se declara este objeto, con el mismo comando también.