2008-10-24 17 views

Respuesta

28

Significa que el tipo de esa variable se ha especificado de forma incompleta. Por ejemplo:

struct hatstand; 
struct hatstand *foo; 

BGF sabe que foo es un puntero a una estructura hatstand, pero no se han definido los miembros de esa estructura. Por lo tanto, "tipo incompleto".

Para imprimir el valor, puede convertirlo a un tipo compatible.

Por ejemplo, si se sabe que foo es realmente un puntero a una estructura lampshade:

print (struct lampshade *)foo 

O bien, puede imprimir como un puntero genérico, o lo trata como si fuera un entero:

print (void *)foo 
print (int)foo 

Véase también estas páginas del manual de GDB:

+0

Buena respuesta, aunque los enlaces son 404. –

+1

Solucionado. No recuerdo a qué estaban vinculados anteriormente, pero estos dos enlaces deberían ser útiles :). –

5

Lo que he encontrado es que si se desmonta una función que utiliza el tipo de estructura GDB incompleta 'descubre' los miembros de la estructura y, posteriormente, puede mostrarlos. 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 de 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.

0

Tuve el mismo problema. Si carga los símbolos de las bibliotecas de forma manual:

set auto-solib-add off 
attach thread_id 
shared any_lib 
shared another_lib 

necesita cargar los símbolos de la biblioteca, donde se declara este objeto, con el mismo comando también.

0

No conozco 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 el .h para una clase, que incluía una declaración de clase delante de una clase de ayuda interior para que la clase externa podría contener un puntero a ella. El .cpp correspondiente tenía la definición completa de la clase de ayuda interna.

Al romper en un método de la clase externa, gdb informó 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 utilizando el mismo puntero que falló anteriormente.

Cuestiones relacionadas