2016-11-04 22 views
1

調試時,我有一個地址進入內存並知道駐留在該地址的對象的類型,並且我希望調試器顯示該實例物體。這可以通過打印命令來完成,這些類型不是模板,但對於模板實例化的類型似乎失敗。使LLDB重新解釋地址作爲指向類型爲模板實例的對象的指針

請參見本示例代碼:

template<typename T> 
class X 
{ 
public: 
    X() { 
     printf("a\n"); 
    } 
}; 

class Y 
{ 
public: 
    Y() { 
     printf("a\n"); 
    } 
}; 



int main(void) 
{ 
    X<int> x; 
    Y y; 

    return 1; 
} 

當我運行該程序,打破主,試圖解釋隨機有效地址爲指針,以X和Y的對象,前者失敗:

(lldb) p *(Y*)0x0000000100000ee6 
(Y) $0 = {} 
(lldb) p *(X<int>*)0x0000000100000ee6 
warning: could not load any Objective-C class information. This will significantly reduce the quality of type information available. 
error: use of undeclared identifier 'X' 
error: expected '(' for function-style cast or type construction 
error: expected expression 

有沒有辦法如何在lldb中做到這一點? (編輯:Mac OS X lldb-360.1.65和lldb-310.2.37)

回答

2

C++的調試信息當前不代表抽象中的模板,它只涉及程序中存在的特定模板實例。但lldb的表達式命令使用了一個真正的C++解析器(clang),它在解析像你嘗試過的表達式時,首先需要將X看作一個抽象模板。由於我們不知道它們,所以我們無法完成clang對X的類型請求,並且 - 這就是爲什麼您看到的錯誤是「未聲明的標識符X」。

你可以通過爲你想要以這種方式施放的指針類型做一個typedef來解決這個問題。這不太令人滿意,因爲你必須先完成它,而且你必須在你的代碼中使用typedef,因爲 - 爲了保持調試信息的大小可管理 - clang不會發出調試信息用過的。但它確實有效,例如我添加到您的示例代碼:

typedef X<int> * x_int_ptr; 

再後來就在主:

x_int_ptr bar = (x_int_ptr) &x; 

,以確保它被記錄下來,然後在六味地黃丸,我可以這樣做:

(lldb) expr *((x_int_ptr) 0x00007fff5fbff798) 
(X<int>) $1 = {} 
相關問題