如何打印<;不完整类型>;gdb中的变量

如何打印<;不完整类型>;gdb中的变量,gdb,Gdb,有时gdb会为某些类型的变量打印“不完整类型”。这意味着什么?我们如何看到该值?这意味着未完全指定该变量的类型。例如: struct hatstand; struct hatstand *foo; GDB知道foo是指向hatstand结构的指针,但该结构的成员尚未定义。因此,“不完整类型” 要打印该值,可以将其强制转换为兼容类型 例如,如果您知道foo实际上是指向灯罩结构的指针: print (struct lampshade *)foo 或者,您可以将其打印为通用指针,或者将其视为整数:

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

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

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

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

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

print (struct lampshade *)foo
或者,您可以将其打印为通用指针,或者将其视为整数:

print (void *)foo
print (int)foo
另请参见GDB手册中的以下页面:


我发现,如果反汇编一个使用不完整结构类型的函数,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”,您将得到“complete type”响应。但是,请尝试“反汇编获取字符串”和“打印*str”,它将正确显示结构和值。我不知道为什么会这样,但确实如此。

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

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

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

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

我的例子是:

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

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


在外部类中的一种方法中发布DASSeMead命令,允许GDB使用以前失败的相同指针来理解内部类的结构。

< P>免责声明:我是一个Python开发人员,只知道一些C++的知识和Linux操作系统的功能,所以我下面描述的只是我个人经历的一个问题的解决方案

如果您试图使用来自第三方库的类型,请确保这些库没有丢失调试信息。 例子 ^当前示例中的所有Qt库都缺少调试信息。这是因为qt-libs的调试信息是在单独的包中提供的,这些包没有安装

无论我做什么,一切都很顺利:

(gdb) whatis e
type = QEvent *
但当我试图访问它的成员时

(gdb) p e->type()
Couldn't find method QEvent::type
并试图获得详细的类型描述

(gdb) ptype e
type = class QEvent {
  <incomplete type>
} *
  • 搜索相关软件包

    使用keywork
    libqt5core5a
    搜索返回2个包,一个是
    libqt5core5a
    本身,另一个是
    libqt5core5a dbgsym
    。后者的描述是:“libqt5core5a的调试符号”

  • 安装带有调试符号的软件包(我还为一些其他基本的Qt库安装了调试符号)

  • 确保在
    gdb
    中库现在有调试信息
  • 现在使用Qt类型的工作与预期的一样

  • 一个简单的typedef
    typedef无符号字符字节如何?我想在
    字节*
    处查看数据。相反,我得到的是
    数据=
    。而
    x/16b数据
    导致
    值无法转换为整数。
    。即使链接对象文件中已完全定义了结构,也只有我一个人会出现此错误吗?有没有办法将gdb指向头文件?
    (gdb) ptype e
    type = class QEvent {
      <incomplete type>
    } *
    
    $ dpkg -S /usr/lib/x86_64-linux-gnu/libQt5Core.so.5
    libqt5core5a:amd64: /usr/lib/x86_64-linux-gnu/libQt5Core.so.5
    
    $ sudo apt install libqt5core5a-dbgsym libqt5widgets5-dbgsym libqt5gui5-dbgsym
    
    (gdb) info share Qt
    From                To                  Syms Read   Shared Object Library
    0x00007ffff5336080  0x00007ffff56ba585  Yes         /usr/lib/x86_64-linux-gnu/libQt5Widgets.so.5
    0x00007ffff4ad3510  0x00007ffff4ef0cbe  Yes         /usr/lib/x86_64-linux-gnu/libQt5Gui.so.5
    0x00007ffff47829c0  0x00007ffff47e1ba1  Yes (*)     /usr/lib/x86_64-linux-gnu/libQt5DBus.so.5
    0x00007ffff40bb5e0  0x00007ffff439dd92  Yes         /usr/lib/x86_64-linux-gnu/libQt5Core.so.5
    0x00007ffff2e571e0  0x00007ffff2e77e4f  Yes (*)     /usr/lib/x86_64-linux-gnu/libQt5Xml.so.5
    0x00007ffff28c7a00  0x00007ffff29d8999  Yes (*)     /usr/lib/x86_64-linux-gnu/libQt5Network.so.5
    0x00007ffff2250750  0x00007ffff2251a46  Yes (*)     /usr/lib/x86_64-linux-gnu/libQt5X11Extras.so.5
    0x00007ffff1cc8f80  0x00007ffff1cfb861  Yes (*)     /usr/lib/x86_64-linux-gnu/libQt5PrintSupport.so.5
    0x00007fffee268c10  0x00007fffee296b57  Yes (*)     /usr/lib/x86_64-linux-gnu/libQt5Svg.so.5
    0x00007fffed985560  0x00007fffed9896a8  Yes (*)     /usr/lib/x86_64-linux-gnu/libQt5TextToSpeech.so.5
    0x00007fffe95fc130  0x00007fffe96eec0c  Yes (*)     /usr/lib/x86_64-linux-gnu/libQt5XcbQpa.so.5
    0x00007fffe701f650  0x00007fffe702fe0d  Yes (*)     /usr/lib/x86_64-linux-gnu/libQt5QuickControls2.so.5
    0x00007fffe623c890  0x00007fffe64db1c1  Yes (*)     /usr/lib/x86_64-linux-gnu/libQt5Quick.so.5
    0x00007fffe5b4f690  0x00007fffe5e4c636  Yes (*)     /usr/lib/x86_64-linux-gnu/libQt5Qml.so.5
    0x00007fffe57c66b0  0x00007fffe584e363  Yes (*)     /usr/lib/x86_64-linux-gnu/libQt5QuickTemplates2.so.5
    (*): Shared library is missing debugging information.
    
    (gdb) p e->type()
    $4 = QEvent::Paint
    (gdb) ptype e
    type = class QEvent {
      public:
    ...
    }