web-dev-qa-db-fra.com

Comment imprimer la variable <type incomplet> dans gdb

Parfois, gdb affiche "type incomplet" pour certains types de variables. Qu'est-ce que cela signifie et comment pouvons-nous voir cette valeur?

43
grigy

Cela signifie que le type de cette variable a été incomplètement spécifié. Par exemple:

struct hatstand;
struct hatstand *foo;

GDB sait que foo est un pointeur sur une structure hatstand, mais les membres de cette structure n'ont pas été définis. Par conséquent, "type incomplet".

Pour imprimer la valeur, vous pouvez la convertir en un type compatible.

Par exemple, si vous savez que foo est vraiment un pointeur sur une structure lampshade:

print (struct lampshade *)foo

Vous pouvez également l’imprimer comme un pointeur générique ou le traiter comme s’il s’agissait d’un entier:

print (void *)foo
print (int)foo

Voir aussi ces pages du manuel GDB:

28
Daniel Cassidy

Ce que j'ai trouvé, c'est que si vous désassemblez une fonction qui utilise le type de structure incomplet gdb 'découvre' les membres de la structure et peut ensuite les afficher. Par exemple, supposons que vous ayez une structure de chaîne:

struct my_string {
    char * _string,
    int _size
} ;

quelques fonctions pour créer et obtenir la chaîne via un pointeur:

my_string * create_string(const char *) {...}
const char * get_string(my_string *){...}

et un test qui crée une chaîne:

int main(int argc, char *argv[]) {
    my_string *str = create_string("Hello World!") ;
    printf("String value: %s\n", get_string(str)) ;
    ...
}

Exécutez-le dans gdb et essayez d'imprimer * str 'et vous obtiendrez une réponse de type "incomplet". Cependant, essayez 'désassemble get_string' puis 'print * str' et cela affichera correctement la structure et les valeurs. Je ne sais pas pourquoi cela fonctionne, mais ça marche.

5
Peter

Je ne connais pas toute la signification de l'erreur, mais comme Peter le fait remarquer, le désassemblage d'une méthode associée permet de rendre certaines définitions de types disponibles.

Mon exemple:

Dans le .h pour une classe, cette classe incluait une déclaration en aval d'une classe de helper interne afin que la classe externe puisse contenir un pointeur sur celle-ci. Le .cpp correspondant avait la définition complète de la classe des aides internes.

Lors de l'introduction d'une méthode de la classe externe, gdb a signalé un type incomplet pour un déréférencement du pointeur sur l'instance de la classe interne via une instance de la classe externe.

L'émission de la commande disasemble sur l'une des méthodes de la classe externe a permis à gdb de comprendre la structure de la classe interne à l'aide du même pointeur qui avait précédemment échoué.

0
memerson

J'ai eu le même problème. Si vous chargez manuellement les symboles de vos bibliothèques:

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

Vous devez charger les symboles de la bibliothèque, où cet objet est déclaré, avec la même commande.

0
isilpekel