2008-10-24 63 views

回答

28

這意味着該變量的類型未完整​​指定。例如:

struct hatstand; 
struct hatstand *foo; 

GDB知道foo是一個指向hatstand結構,但是結構的成員沒有被定義。因此,「不完整的類型」。

要打印該值,可以將其轉換爲兼容類型。

例如,如果你知道foo真的是一個指向lampshade結構:

print (struct lampshade *)foo 

或者,你可以打印作爲一種通用的指針,或把它當作好像它是一個整數

print (void *)foo 
print (int)foo 

參見這些網頁從GDB手冊:

+0

不錯的答案,雖然鏈接是404。 – 2009-12-07 10:42:28

5

什麼我發現是,如果你拆開使用不完整的結構類型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',然後'打印* str',它會正確顯示結構和值。我不知道爲什麼這個工作,但它確實。

0

我有同樣的問題。如果您從庫手動加載符號:

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

您需要加載從庫,其中該對象被聲明,使用相同的命令,以及符號。

0

我不知道錯誤的全部含義,但正如彼得指出的那樣,反彙編相關方法會使某些類型定義可用。

我的例子:

在.H一類,該類包括內部輔助類的前向聲明,使得外類可以包含一個指向它的指針。相應的.cpp具有完整的內部幫助器類定義。

在突破外部類的方法時,gdb報告了通過外部類的實例取消引用內部類實例的指針的不完整類型。

在外部類中的某個方法上發出disasemble命令,gdb可以使用與先前失敗相同的指針來理解內部類的結構。