2016-07-22 17 views
4

std :: tupleで個々の値を抽出/出力するにはどうすればよいですか?GDB:std :: tupleから値を抽出するには

ここには、test.ccという名前のファイルのサンプルプログラムがあります。

#include <tuple> 
#include <iostream> 

using namespace std; 

int main() { 
    auto t = make_tuple(111, 222); 
    cout << std::get<0>(t) << endl 
      << std::get<1>(t) << endl; 
    return 0; 
} 

GDBで

g++ --std=c++11 -g test.cc 

それをコンパイルし実行して

gdb --args ./a.out 
... 
(gdb) start 
Temporary breakpoint 1 at 0x400836: file test.cc, line 7. 
Starting program: /home/fmlheureux/a.out 

Temporary breakpoint 1, main() at test.cc:7 
7   auto t = make_tuple(111, 222); 
(gdb) n 
9    << std::get<1>(t) << endl; 
(gdb) p t 
$1 = std::tuple containing = {[1] = 111, [2] = 222} 

は最後のコマンドは、全体としてタプルを印刷。個々の値をどのように抽出できますか?私の純粋な試みは失敗する。

(gdb) p get<0>(t) 
No symbol "get<0>" in current context. 
(gdb) p std::get<0>(t) 
No symbol "get<0>" in namespace "std". 
+0

私の解決策は、 'tuple'の代わりに' struct'を使うことです。 gdbはそれを処理できます。もちろん、実際にはgdbはタプルアクセスをサポートする必要があります... – TheJJ

答えて

4

残念ながら、GDBにおけるプリティプリントコードが表示のみの機能である - それは良い方法でタプルを表示することができますが、それはあなたのさらなるアクセスにそれをさせないように。

t.get<0>のような通常の問題は、これらの小さなアクセサメソッドは、通常、コンパイラによって完全に最適化されているため、呼び出すコピーがないことです。そして、gdbには、これらのアクセサのgdb側のPython実装を提供するために使用できる「xmethod」機能がありますが、info xmethodsはまだ少なくともstd::tupleでこれを行っていないことを示しています。

それでは、実装の検査という1つの選択肢が残っています。

はここ
(gdb) p/r t 
$3 = {<std::_Tuple_impl<0ul, int, int>> = {<std::_Tuple_impl<1ul, int>> = {<std::_Head_base<1ul, int, false>> = { 
     _M_head_impl = 222}, <No data fields>}, <std::_Head_base<0ul, int, false>> = {_M_head_impl = 111}, <No data fields>}, <No data fields>} 

あなたはタプルの「本当の」構造を見ることができ、直接フィールドにアクセス:

(gdb) print ((std::_Head_base<1ul, int, false>) t)._M_head_impl 
$7 = 222 

中間型へのこのキャストは一種であるので、生のタプルを印刷することにより開始痛みの、ええ? gdbに正しい_M_head_implフィールドを選択させる必要があります。これが何かを計画しているのであれば、私はそれを書くことをお勧めしたいと思います。xmethod。また、アクセスを自動化するPythonの便利な関数を簡単に記述することもできます。この種のイントロスペクションは、Python APIでやりやすくなります。

+1

ソリューションをありがとう!将来の読者のために、私は、1ulがタプル内のインデックスであることを指摘したいと思います。 –

関連する問題