std::vector
GDB でaの内容を調べたいのですが、どうすればよいですか?std::vector<int>
単純化するためのものだとしましょう。
std::vector
GDB でaの内容を調べたいのですが、どうすればよいですか?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)でうまく機能します。
$HOME/.gdbinit
が必要だという印象がありました。現時点では、そのようなファイルはまったく存在せずgdb
、のコンテンツを正しく表示していますstd::vector
。ただし、「とりとめのない」試行中にインストールしてアンインストールしただけcgdb
で、すでにlibstdc++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
Cannot evaluate function -- may be inlined
_M_impl
GDBの下であなたのコンパイラ7.0以降、使用するためなど)print /r myVector
デバッグ中に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'}}