如何在gdb中打印<incomplete type>variables

有时gdb会为某些types的variables打印“不完整types”。 这是什么意思?我们如何看待这个价值呢?

这意味着该variables的types已经被不完整地指定。 例如:

struct hatstand; struct hatstand *foo; 

GDB知道foo是一个指向hatstand结构的指针,但是该结构的成员还没有被定义。 因此,“不完整的types”。

要打印该值,可以将其转换为兼容的types。

例如,如果您知道foo实际上是指向lampshade结构的指针:

 print (struct lampshade *)foo 

或者,您可以将其打印为通用指针,或将其视为整数:

 print (void *)foo print (int)foo 

另请参阅GDB手册中的这些页面:

我发现的是,如果反汇编使用不完整的结构types的函数,gdb会“发现”结构成员并随后显示它们。 例如,假设你有一个stringstruct:

 struct my_string { char * _string, int _size } ; 

一些通过指针创build和获取string的函数:

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

并创build一个string的testing:

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

在gdb中运行它,并尝试“打印* str”,你会得到一个“不完整types”的响应。 但是,尝试“反汇编get_string”,然后“打印* str”,它会正确显示结构和值。 我不知道为什么这个工作,但它确实。

我有同样的问题。 如果您手动加载库中的符号:

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

您需要使用相同的命令从声明该对象的库中加载符号。

我不知道错误的全部含义,但正如彼得指出的那样,反汇编一个相关的方法会使某些types定义可用。

我的例子:

在类的.h中,该类包含一个内部帮助类的前向声明,以便外部类可以包含指向它的指针。 相应的.cpp具有完整的内部帮助程序类定义。

在打破外部类的方法时,gdb通过外部类的实例报告了不完整的types,以指向内部类实例的指针。

在外部类的其中一个方法上发出disasemble命令,gdb可以使用与之前失败相同的指针来理解内部类的结构。