2016-04-27 11 views
1

私はいくつかのテンプレートコードをデバッグしていて、lldbに、巨大な複雑なtypedefの代わりにフレーム変数の実際の型(c-type)を表示させたいと思います。実際の型は "int"や "unsigned char"のようなものですが、typedefだけが特定のテンプレートインスタンスを知らないかのように表示されます。例えばtypedefの実際のタイプをlldbで表示できますか?

: "var_t fooという= 1" に設定されたブレークポイントで停止

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; 
} 

は、私は本当に

foo = (long)0 

のようなものを見る必要が

foo = (var_t)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スクリプトがこれを自動化することができます。私は "image lookup -t template_name :: var_t"などを使用することはできません。 –

関連する問題