web-dev-qa-db-ja.com

GDBでC ++ベクトルの要素を印刷するにはどうすればよいですか?

GDBのstd::vectorの内容を調べたいのですが、どうすればよいですか?簡単にするためにstd::vector<int>としましょう。

199
John Carter

ベクトル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 で説明されています。

さらに、上記のインストール後、これはEclipseC++デバッガーGUI(および他のIDE)でうまく機能します。考える)。

72

GCC 4.1.2では、myVectorと呼ばれるstd :: vector <int>全体を印刷するには、次の手順を実行します。

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
249
John Carter

デバッグ中に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でコンパイルします

14
Nikhil

以下を〜/ .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'}}
8
badeip