如何在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可以使用与之前失败相同的指针来理解内部类的结构。