代码之家  ›  专栏  ›  技术社区  ›  grigy

如何在gdb中打印变量

gdb
  •  43
  • grigy  · 技术社区  · 16 年前

    有时,gdb会为某些类型的变量打印“不完整类型”。这意味着什么?我们如何才能看到这个价值?

    4 回复  |  直到 8 年前
        1
  •  28
  •   Daniel Cassidy    9 年前

    这意味着该变量的类型没有完全指定。例如:

    struct hatstand;
    struct hatstand *foo;
    

    GDB知道 foo 是指向 hatstand 结构,但该结构的成员尚未定义。因此,“不完整类型”。

    要打印该值,可以将其强制转换为兼容的类型。

    例如,如果你知道 实际上是指向 lampshade 结构:

    print (struct lampshade *)foo
    

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

    print (void *)foo
    print (int)foo
    

    另请参见GDB手册的以下页面:

        2
  •  5
  •   Peter    12 年前

    我发现的是,如果反汇编使用不完整结构类型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”,您将得到一个“不完整的类型”响应。但是,尝试“disassemble get_string”然后“print*str”,它将正确显示结构和值。我不知道为什么会这样,但确实如此。

        3
  •  0
  •   isilpekel    9 年前

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

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

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

        4
  •  0
  •   memerson    8 年前

    我不知道错误的全部含义,但是正如Peter所指出的,相关方法的反汇编可以使一些类型定义可用。

    我的例子:

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

    在中断外部类的方法时,gdb报告通过外部类的实例取消对内部类实例的指针引用的类型不完整。

    对外部类中的一个方法发出disassemble命令允许gdb使用以前失败的相同指针了解内部类的结构。

    推荐文章