GDBでC ++ベクトルの要素を印刷するにはどうすればよいですか?
質問
GDBのstd::vector
の内容を調べたいのですが、どうすればよいですか?簡単にするためにstd::vector<int>
であるとしましょう。
解決
ベクターstd :: vector myVectorの内容を表示するには、GDBと入力するだけです:
(gdb) print myVector
これにより、次のような出力が生成されます。
$1 = std::vector of length 3, capacity 4 = {10, 20, 30}
上記を達成するには、gdb 7(gdb 7.01でテストしました)といくつかのPython pretty-printerが必要です。これらのインストールプロセスは、 gdb wiki で説明されています。
さらに、上記をインストールした後、これは Eclipse C ++デバッガーGUI(および私が思うにGDBを使用する他のIDE)でうまく機能します。
他のヒント
GCC 4.1.2では、std :: vector <!> lt; int <!> gt;全体を印刷します。 myVectorと呼ばれる、次の操作を行います。
print *(myVector._M_impl._M_start)@myVector.size()
最初のN個の要素のみを印刷するには、次のようにします。
print *(myVector._M_impl._M_start)@N
説明
これはおそらくコンパイラのバージョンに大きく依存していますが、GCC 4.1.2の場合、内部配列へのポインターは次のとおりです。
myVector._M_impl._M_start
そして、ポインタPから始まる配列のN個の要素を出力するGDBコマンドは次のとおりです。
print P@N
または、短い形式(標準の.gdbinitの場合):
p P@N
デバッグ中の「ウォッチング」STLコンテナは、やや問題があります。これまでに使用した3つの異なるソリューションがありますが、どれも完璧ではありません。
1) http://clith.com/gdb_stl_utils/ のGDBスクリプトを使用するほとんどすべてのSTLコンテナの内容を印刷します。問題は、これがセットのスタックのようなネストされたコンテナに対して機能しないことです。
2)Visual Studio 2005は、STLコンテナの監視を強力にサポートしています。これはネストされたコンテナで機能しますが、STLの実装のみであり、STLコンテナをBoostコンテナに入れている場合は機能しません。
3)デバッグ中に印刷する特定のアイテムに対して独自の「印刷」関数(またはメソッド)を記述し、GDBでアイテムを印刷するときに「呼び出し」を使用します。印刷関数がコードのどこでも呼び出されていない場合、g ++はデッドコードの除去を行い、GDBによって「印刷」関数が検出されないことに注意してください(関数がインライン化されているというメッセージが表示されます)。したがって、-fkeep-inline-functionsでコンパイルします
〜/ .gdbinitに以下を入力します
define print_vector
if $argc == 2
set $elem = $arg0.size()
if $arg1 >= $arg0.size()
printf "Error, %s.size() = %d, printing last element:\n", "$arg0", $arg0.size()
set $elem = $arg1 -1
end
print *($arg0._M_impl._M_start + $elem)@1
else
print *($arg0._M_impl._M_start)@$arg0.size()
end
end
document print_vector
Display vector contents
Usage: print_vector VECTOR_NAME INDEX
VECTOR_NAME is the name of the vector
INDEX is an optional argument specifying the element to display
end
gdbを再起動(または〜/ .gdbinitをソース)した後、このような関連ヘルプを表示
gdb) help print_vector
Display vector contents
Usage: print_vector VECTOR_NAME INDEX
VECTOR_NAME is the name of the vector
INDEX is an optional argument specifying the element to display
使用例:
(gdb) print_vector videoconfig_.entries 0
$32 = {{subChannelId = 177 '\261', sourceId = 0 '\000', hasH264PayloadInfo = false, bitrate = 0, payloadType = 68 'D', maxFs = 0, maxMbps = 0, maxFps = 134, encoder = 0 '\000', temporalLayers = 0 '\000'}}