GDBで a の内容を調べたいのですがstd::vector
、どうすればよいですか? std::vector<int>
簡単にするためにa だとしましょう。
5 に答える
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
ベクトル 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) でうまく機能します。
以下を ~/.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'}}
パーティーに少し遅れたので、次にこの検索を行うときに主に思い出させてください!
私は使用できました:
p/x *(&vec[2])@4
からvec
始まる 4 つの要素 (16 進数として) を出力しvec[2]
ます。