226

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

4

5 に答える 5

279

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
于 2008-10-31T10:33:23.477 に答える
82

ベクトル 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) でうまく機能します。

于 2010-01-23T13:23:51.787 に答える
14

以下を ~/.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'}}
于 2014-08-26T06:57:03.180 に答える
0

パーティーに少し遅れたので、次にこの検索を行うときに主に思い出させてください!

私は使用できました:

p/x *(&vec[2])@4

からvec始まる 4 つの要素 (16 進数として) を出力しvec[2]ます。

于 2020-05-15T16:04:59.850 に答える