2016-04-27 64 views
1

我正在調試一些模板代碼,並希望lldb向我展示一個幀變量的實際類型(c型),而不是一個怪異複雜的typedef。實際的類型可能類似於「int」或「unsigned char」,但是它只顯示typedef,就好像它不知道具體的模板實例。可以顯示typedef的實際類型嗎?

例如:

template <typename T> 
struct helper 
{ 
    using type = long; 
}; 

int main(int argc, const char * argv[]) { 

    using var_t = typename helper<short>::type; 

    var_t foo = 1; 
} 

在對 「var_t富= 1」 設置斷點停止顯示

foo = (var_t)0 

我真的需要看到類似

foo = (long)0 

有任何方式來做到這一點,或找出解決的類型是什麼?

我使用的XCode 7.3和LLDB-350.0.21.3

回答

3

有沒有辦法告訴變量打印機顯示解析類型,而不是聲明變量的類型。你可以找出了一個typedef解析的類型使用的image lookup類型搜索模式:

(lldb) image lookup -t var_t 
1 match found in /private/tmp/foo: 
id = {0x000000b2}, name = "var_t", byte-size = 8, decl = foo.cpp:9, compiler_type = "typedef var_t" 
    typedef 'var_t': id = {0x00000043}, name = "helper<short>::type", byte-size = 8, decl = foo.cpp:4, compiler_type = "typedef helper<short>::type" 
    typedef 'helper<short>::type': id = {0x000000eb}, name = "long int", qualified = "long", byte-size = 8, compiler_type = "long" 

這裏的另一種方式來獲得從Python API相同的信息,如果你想使用:

(lldb) script 
Python Interactive Interpreter. To exit, type 'quit()', 'exit()' or Ctrl-D. 
>>> foo_var = lldb.frame.FindVariable("foo") 
>>> foo_type = foo_var.GetType() 
>>> print foo_type 
typedef var_t 
>>> print foo_type.GetCanonicalType() 
long 

如果你需要做很多事情,你可以編寫一個基於Python的lldb命令來打印完全解析的類型。有信息在這裏:

http://lldb.llvm.org/python-reference.html

如何做到這一點。

+1

這讓我走上了一條有用的軌道。它仍然報告類型而不考慮具體的模板實例。我發現添加-A標誌至少會顯示所有可能的解析類型。我想要的就是在那裏 - 我只需要眼睛看看哪一個匹配我正在檢查的模板實例。也許一個python腳本可以自動執行此操作。這太糟糕了,我無法使用「圖像查找-t template_name :: var_t」等。 –

相關問題