有时gdb会为某些类型的变量打印"不完整类型".这意味着什么,我们怎样才能看到这个价值?
这意味着该变量的类型未完全指定.例如:
struct hatstand; struct hatstand *foo;
GDB知道这foo
是一个指向hatstand
结构的指针,但该结构的成员尚未定义.因此,"不完整类型".
要打印该值,可以将其强制转换为兼容类型.
例如,如果您知道它foo
实际上是指向lampshade
结构的指针:
print (struct lampshade *)foo
或者,您可以将其打印为通用指针,或将其视为整数:
print (void *)foo print (int)foo
另请参阅GDB手册中的这些页面:
http://sourceware.org/gdb/current/onlinedocs/gdb/Data.html#Data
http://sourceware.org/gdb/current/onlinedocs/gdb/Symbols.html#Symbols
我发现如果你反汇编一个使用不完整结构类型的函数,gdb'发现'结构成员,然后可以显示它们.例如,假设您有一个字符串结构:
struct my_string { char * _string, int _size } ;
一些通过指针创建和获取字符串的函数:
my_string * create_string(const char *) {...} const char * get_string(my_string *){...}
以及创建字符串的测试:
int main(int argc, char *argv[]) { my_string *str = create_string("Hello World!") ; printf("String value: %s\n", get_string(str)) ; ... }
在gdb中运行它并尝试'print*str',你会得到一个'不完整类型'的响应.但是,尝试'反汇编get_string'然后'print*str',它将正确显示结构和值.我不知道为什么会这样,但确实如此.